0

の上部にJTextFieldあるに検索バーとしてを追加しようとしています。私の問題は、で使用可能なすべてのスペースを占めるようにサイズが変更され続けることです。私は試しましたが、これらは機能しませんでした。おそらく、で使用されているものがこれらのサイズを尊重していないためです。また、をaに追加し、パネルをに追加しようとしましたが、次のようになります。JMenuBarJFrameJTextFieldJMenuBarsetPreferredSize()setMaximum Size()LayoutManagerJMenuBarJTextFieldJPanelFlowLayoutJMenuBar

パネルはの右側にJMenuBarあり、サイズは正しいようですが、この奇妙な青いバー以外は何も見えません。

これが(私が思うに)関連するコードです。さらに必要な場合はお知らせください。

       JPanel searchPanel = new JPanel();
    searchPanel.setPreferredSize(new Dimension(100, 25));


    JTextField searchBar = new JTextField(50);

    String[] fields = {"title", "author", "subject", "publisher", "year", "circulating", "catalog" };


    JComboBox searchFields = new JComboBox(fields);

    JButton searchBtn = new JButton("search");

    searchPanel.add(searchBar);
    searchPanel.add(searchFields);
    searchPanel.add(searchBtn);
    searchPanel.setVisible(true);

    fileMenu.add(open);
    fileMenu.add(save);
    fileMenu.add(exit);

    libMenu.add(viewLib);
    libMenu.addSeparator();
    libMenu.add(newBook);
    libMenu.add(search);

    this.setJMenuBar(topBar);
       topBar.add(fileMenu);
    topBar.add(libMenu);
    topBar.add(Box.createHorizontalGlue());
   topBar.add(searchPanel);
4

2 に答える 2

3

これは私のために働きます。

menuBar.add(Box.createHorizontalGlue());
JTextField textField = new JTextField(10);
textField.setMaximumSize( textField.getPreferredSize() );
menuBar.add(textField);

さらにヘルプが必要な場合は、SSCCEを投稿してください。

編集:

繰り返しになりますが、投稿されたコードは、問題がテキストフィールドの最大サイズを含むことにあることを示すためだけのものでした。これをどのように選択するかはあなた次第です。

于 2013-03-06T02:04:56.360 に答える
3

私のソリューションはcamickrのソリューションに似ていますが、setMaximumSize()は必要ありません。私はそれに反対しているわけではありませんが、SOには「setXxxsize()をこれまでに呼び出したことはありません!!!」と誓う熱狂者がいることは知っています。私はその一人ではありませんが、彼らはそこにいます。

とにかく、GridBagLayoutを使用してJPanelを作成し、JTextFieldをNONEで埋め、Box.createHorizo​​ntalGlue()をHORIZONTALで埋めます。次に、このパネルをメニューバーに配置します。

編集:

完全を期すために、setMaximumSize(...)を呼び出さなくてもJPanelを使用するソリューションを次に示します
(したがって、永遠に地獄で燃えるのを避けます...一部の人によると):

GridBagConstraints gbc = new GridBagConstraints();
JPanel gbPanel = new JPanel(new GridBagLayout());
gbc.gridx = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
gbPanel.add(Box.createHorizontalGlue(), gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0;
gbPanel.add(new JTextField(10), gbc);
menuBar.add(gbPanel);

いくつかのコメント:
1)男、私はGBLがどれほど冗長であるかを忘れました。通常、私はコードを大幅に削減するヘルパークラスを使用しますが、そのような小さな例のためにそれを投稿する気はありませんでした。

2)パネルルートを使用する場合、BorderLayoutを使用するというcamickrの提案(以下のコメントを参照)は機能するだけでなく、はるかに単純なコードです。

3)また、camickrが指摘したように、パネルを使用すると「接着剤」領域の外観に影響します。JMenuBarではなくJPanelのようにペイントされます。正直なところ、彼がそれを言うまで、私は(Metal L&Fを使用して)私のマシンでそれを気づいていませんでしたが、それは異なり、望ましくない副作用である可能性があります。

于 2013-03-06T04:41:38.300 に答える