
このカテゴリに初めて質問させて頂きます。使用しているJDKの
バージョンは1.4.2です。
今、JavaのSwingを利用してGUIアプリケーションを作成している
のですがJMenuに数十個のJMenuItemを配置させる必要があるの
ですが、大量のJMenuItemをJMenuに配置すると画面からはみ出
してしまいます。
そこで、JMenuで表示させるJMenuItemの数を制限し、それ以外
のJMenuItemはスクロールのような形で表示できるようにしたい
と思っているのですがこのような事は実現可能でしょうか?
No.3ベストアンサー
- 回答日時:
こんばんは。
とりあえず、タイマーで動かすことにしてみました。
それっぽく、動きます。
ただ、適当に作ったので、表示するメニューの高さを適切に調整するとか、まだまだ作り込む余地があるのですが、ヒントにはなると思います。
それにしても、なんでこの機能がSwingにないのでしょうねぇ。
不便です。
(コンパイルするときは全角スペースを半角スペースに変換してからにしてください)
import javax.swing.*;
import java.awt.event.*;
public class Test extends JFrame {
JMenuBar menubar;
JMenu menuFile;
JMenuItem upButton;
JMenuItem downButton;
Timer timer;
boolean up;
public static void main(String[] args) {
Test frame = new Test();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
}
public Test() {
timer = new Timer(500, new Timer_Action());
menubar = new JMenuBar();
menuFile = new JMenu("ファイル(F)");
upButton = new JMenuItem("▲");
Scroll_Clicked sc = new Scroll_Clicked();
upButton.addMouseListener(sc);
downButton = new JMenuItem("▼");
downButton.addMouseListener(sc);
setJMenuBar(menubar);
menubar.add(menuFile);
menuFile.add(upButton);
for (int i = 0; i < 50; i++) {
JMenuItem item = new JMenuItem("メニュー" + Integer.toString(i));
if (i > 30)
item.setVisible(false);
menuFile.add(item);
}
menuFile.add(downButton);
}
private void scrollUp() {
for (int i = 1; i < menuFile.getItemCount() - 30; i++) {
if (menuFile.getItem(i).isVisible()) {
menuFile.getItem(i).setVisible(false);
menuFile.getItem(i + 30).setVisible(true);
return;
}
}
timer.stop();
}
private void scrollDown() {
for (int i = menuFile.getItemCount() - 2; i > 30; i--) {
if (menuFile.getItem(i).isVisible()) {
menuFile.getItem(i).setVisible(false);
menuFile.getItem(i - 30).setVisible(true);
return;
}
}
timer.stop();
}
private class Scroll_Clicked extends MouseAdapter {
public void mouseEntered(MouseEvent e) {
Object source = e.getSource();
if (source == upButton)
up = true;
else
up = false;
timer.start();
}
public void mouseExited(MouseEvent e) {
timer.stop();
}
}
private class Timer_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (up)
scrollUp();
else
scrollDown();
}
}
}
ym2です。
PecoPlusさん、わざわざソースコードまで載せて頂いて感謝
です。こういうときにもTimerが使えるとは思いつきませんでした。
これで上手い具合にMenuItemの表示を制御できるようになりました。
No.5
- 回答日時:
#1です。
#2さんの方法が自分には衝撃的だったので、試しました。
うまくいきました。感動しました。
#2さん、ありがとうございます。勉強になりました。
自分の環境は1.3.0_01と古い?ので、他の方とバージョンが違うのでもしかしたら動かないかもしれません。
稚拙なコードですが、いちおう貼り付けておきます。
(って全部表示できるかな…)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MenuTest extends JFrame implements ActionListener{
private int begin = 0;
private int end = 4;
private JButton up = new JButton("▲");
private JButton down = new JButton("▼");
private JMenuItem[] items = new JMenuItem[10];
public MenuTest(){
super();
JMenu menu = new JMenu("hoge");
JMenuBar menubar = new JMenuBar();
menubar.add(menu);
up.addActionListener(this);
down.addActionListener(this);
menu.add(up);
for(int i = 0;i < items.length;i++){
items[i] = new JMenuItem(""+i);
items[i].addActionListener(this);
menu.add(items[i]);
}
menu.add(down);
setJMenuBar(menubar);
setSize(200,200);
setVisible(true);
items[0].setVisible(true);
items[1].setVisible(true);
items[2].setVisible(true);
items[3].setVisible(true);
items[4].setVisible(true);
items[5].setVisible(false);
items[6].setVisible(false);
items[7].setVisible(false);
items[8].setVisible(false);
items[9].setVisible(false);
}
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
System.out.println("アクションコマンド:"+command);
if(command.equals("▲")){
if(begin != 0){
items[begin-1].setVisible(true);
items[end].setVisible(false);
begin = begin-1;
end = end-1;
}
}else if(command.equals("▼")){
if(end != 9){
items[begin].setVisible(false);
items[end+1].setVisible(true);
begin = begin+1;
end = end+1;
}
}else{
System.out.println("なにもしない");
}
}
public static void main(String[] args){
MenuTest mt = new MenuTest();
}
}
No.4
- 回答日時:
#3です。
試行錯誤をしていたので、MouseAdapterのクラス名が妙なことになってますね。
すみません。かえって混乱しますね。
最初は#2さんの言われるような方法を考えていたのですが、私の環境(J2SE5.0)でJMenuにJButtonを登録すると、ActionEventがトリガされなかったので、しかたないので、JMenuItemにかえました。
すると、クリックすると(当たり前の話ですが)メニューが消えてしまうので、マウスポインタが上に来ると、Timerをスタートさせて、Timerのイベントハンドラからスクロールさせるメソッドを呼ぶようにしました。
とりあえず、50個のメニューのうち30個を表示するようになっていますが、環境によって、ちょうど言い数は違ってくるので、これを動的に変えるようにしなくてはいけないのですが、めんどくさいのでやっていません。
そこら辺のことをちゃんと考えて、ScrollableMenu みたいなクラスを作っておけば、便利でいいのでしょうが・・・。
がんばってください。

No.2
- 回答日時:
ごく基本的な考え方だけですが。
1.JButtonを2つ用意します。上向きのスクロール用、下向きのスクロール用です。
2.JMenuを作成し、上向きスクロールのJButton、続いてJMenuItemを必要なだけ、最後に下向きスクロールのJButtonをaddします。つまり、2つのJButtonの間にJMenuItemがずら~っと並ぶようにするわけです。
3.一番最初のJMenuItemから、表示させる数だけのJMenuItemをsetVisible(true)し、それ以後のものをすべてsetVisible(false)します。
4.上向きのJButtonのactionPerformedでは、表示されている一番下のJMenuItemを非表示にし、一番上のJMenuItemの1つ上のものを表示させます。
5.下向きのJButtonでは、反対に表示されている一番上のものを非表示にし、一番下の更に1つ下のものを表示させます。
ざっとこんな感じで上下にスクロールするメニューができると思います。
要するにsetVisibleで表示非表示を切り替えているだけですが、スクロールした「感じ」にはなると思います。
No.1
- 回答日時:
直接的な回答にはなっていませんが、
その数十個のメニューは全てバラバラですか?
ある程度グループ分けできませんか?
グループ分けできるなら、グループのメニューのJMenuクラスを生成して、
JMenuクラスのadd(JMenuItem menuItem)メソッドで追加すればいいのでは?
JMenuクラスはJMenuItemクラスのサブクラスなのでaddできますよ。
例
JMenu view = new JMenu("表示");
JMenu size = new JMenu("サイズ");
JMenuItem l = new JMenuItem("大");
JMenuItem m = new JMenuItem("中");
JMenuItem s = new JMneuItem("小");
size.add(l);
size.add(m);
size.add(s);
view.add(size);
これで例えばIEの[表示]ー[サイズ]ー[大]みたいなサブメニューみたいになります。
質問者さんの希望には答えられてませんが、いかがでしょう?
この回答への補足
pcbegginerさん、レスどうもです。
サブメニュー化は私も考えたのですが結局、サブメニューの中に
数十個のJMenuItemが移動するだけでサブメニューが画面から
はみ出してしまうんですよねぇ。
それで何とかならないかなぁと思い、ここに質問した次第です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 タスクバー上に表示されたアドレス・ボックス? 1 2023/04/30 17:37
- 防犯カメラ・監視カメラ・小型カメラ VHSを高画質な動画ファイルにしたいです。 3 2022/05/06 12:08
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- 一戸建て 家の太陽光発電をLIXIL TEPCOの『建て得』採用してる人いませんか? 現在の発電量などをリアル 1 2023/04/03 06:39
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- 英語 節を列挙する例示表現について 2 2022/08/15 13:52
- アプリ iPhoneのホーム画面上でのアプリ表示数を増やす方法はありますか? 1ページ(スクロール無し)でワ 1 2022/07/16 17:03
- Excel(エクセル) [クイックアクセスツールバー]の設定ファイルの格納場所について、 5 2023/04/21 14:43
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Buttonを押すと画像が表示され...
-
JPanelの切り替えと再描画
-
画像からヒストグラムを作りた...
-
JDialogを閉じた時の処理
-
javaで文字数制限するには?
-
ボタンクリック後パネルを再描...
-
SwingのJMenuに大量のJMenuItem...
-
VB6.0でのTextboxの高さ変更
-
ArrayListの使い方について(初...
-
JAVA コンソールではなくGUIで...
-
double型変数値の整数部分のみ...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
実数からの小数部の取得
-
ループ処理の際、最後だけ","を...
-
プログラミングの問題です。大...
-
eclipseに記述したjavaファイル...
-
JSPやサーブレットでSystem.out...
-
Javaで改行などが出来ないのです。
-
<forEach> 内で供給された "ite...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
最後の行に移動するには?
-
setPrefferedSizeとsetSize
-
Buttonを押すと画像が表示され...
-
JPanelの切り替えと再描画
-
4択クイズでのランダム出題の...
-
【Swing】JPanel クラス外から...
-
Java-Swing TextAreaにスクロー...
-
KeyListenerの使い方について
-
ArrayListの使い方について(初...
-
連番をオブジェクト名の最後に...
-
TextAreaでの文字の色
-
JPanelの重ね方/OverlayLayout他
-
エラーで式の開始が不正ですと...
-
VB6.0でのTextboxの高さ変更
-
EXECLの行を削除
-
JDialogを閉じた時の処理
-
ラムダ式とかデリゲートっぽい...
-
ボタンクリック後パネルを再描...
おすすめ情報