4

firefox のアドレスバーのような textwidget/component を作成したいと思います。フィールド内に小さなボタンを配置できるテキストフィールドを意味します(キャンセル/リロードなど)

Textfield を最大化し、残りを右から左に配置するカスタム レイアウト マネージャーを作成して、JLayeredPane をカスタマイズしてみました。私の問題は、これによりペイントの問題が発生したことです。テキストフィールドに追加したアイテムが常に表示されるとは限りません。これは Jython に関連している可能性がありjava.lang.Integer(1)ますJLayeredPane.add。ただし、レイヤーは、ドキュメントに記載されているものとはまったく逆に並べられています。

JLayeredPaneこれを解決するために、私は独自のクラスを派生させ、 paintcall を再定義しました。callpaintComponentsはすべてのコンポーネントを繰り返し処理し、ペイント メソッドを呼び出します。

ただし、常に更新をすぐに取得できるとは限りません。つまり、ボタンが非表示または部分的にしか表示されず、ボタンを操作できません。

  1. 画面上で更新を実際に確認するにはどうすればよいですか (バッファに隠されていますか?)
  2. ボタンを操作できるようにするにはどうすればよいですか?
  3. ボタンでテキストが隠れないように、Textfield の最後に到達する前にテキストが前面にスクロールし始めるように、Textxtfield を短くするにはどうすればよいですか? テキストフィールド領域をボタンの下に拡張したい

編集:ウィンドウを小さくした後、ボタンは適切な場所にのみ表示され、その後クリック可能になります

edit2:私は自由に答えをこれに要約しました。これにより、多くのボタンコード/不要なものが隠されます

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class playground {

    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");

    public playground() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        panel.add(makeButton(), BorderLayout.WEST);

        JTextField text = new JTextField(20);
        text.setBorder(null);
        panel.add(text, BorderLayout.CENTER);
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setOpaque(false);
        buttonsPanel.setLayout(new GridLayout(1, 2, 2, 2));

        buttonsPanel.add(makeButton());
        buttonsPanel.add(makeButton());

        panel.add(buttonsPanel, BorderLayout.EAST);
        panel.setBackground(text.getBackground());

        JMenuBar menuBar = new JMenuBar();
        menuBar.add(panel);
        menuBar.add(Box.createHorizontalGlue());
        JFrame frame = new JFrame("MenuGlueDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar);
        frame.pack();
        frame.setVisible(true);
    }

    public JToggleButton makeButton() {
        final JToggleButton button = new JToggleButton();
        button.setFocusable(false);
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setBorder(null);

        button.setIcon((errorIcon));
        button.setRolloverIcon((infoIcon));
        button.setSelectedIcon(warnIcon);
        button.setPressedIcon(warnIcon);

        button.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (button.isSelected()) {
                } else {
                }
            }
        });

        return button;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                playground menuGlueDemo = new playground();
            }
        });
    }
}
4

2 に答える 2

5

たとえば、オートコンプリート ComboBox / JFextFieldを使用して、 JMenuBarを使用することで簡単にできるかもしれません

ここに画像の説明を入力

import java.awt.ComponentOrientation;
import javax.swing.*;

public class MenuGlueDemo {

    public MenuGlueDemo() {
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createMenu("Menu 1"));
        menuBar.add(createMenu("Menu 2"));
        menuBar.add(createMenu("Menu 3"));
        menuBar.add(new JSeparator());
        menuBar.add(new JButton("   Seach ....  "));
        menuBar.add(new JTextField("   Seach ....  "));
        menuBar.add(new JComboBox(new Object[]{"height", "length", "volume"}));
        menuBar.add(Box.createHorizontalGlue());
        menuBar.add(createMenu("About"));
        JFrame frame = new JFrame("MenuGlueDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar);
        frame.pack();
        frame.setVisible(true);
    }

    public JMenu createMenu(String title) {
        JMenu m = new JMenu(title);
        m.add("Menu item #1 in " + title);
        m.add("Menu item #2 in " + title);
        m.add("Menu item #3 in " + title);
        if (title.equals("About")) {
            m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }
        return m;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MenuGlueDemo menuGlueDemo = new MenuGlueDemo();
            }
        });
    }
}

編集

適切なレイアウトのコンテナにテキスト入力といくつかのボタンを配置して [Textfield...] [B1] [B2] を実現できますが、[Textfield [B1] [B2]] が必要です。

ここに画像の説明を入力

適切なLayoutManagerを使用

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class MenuGlueDemo {

    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");

    public MenuGlueDemo() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JButton button = new JButton();
        button.setFocusable(false);
        //button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setIcon((errorIcon));
        button.setPressedIcon(warnIcon);
        panel.add(button, BorderLayout.WEST);
        JTextField text = new JTextField(20);
        text.setBorder(null);
        panel.add(text, BorderLayout.CENTER);
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setOpaque(false);
        buttonsPanel.setLayout(new GridLayout(1, 2, 2, 2));
        final JToggleButton toggleButton = new JToggleButton();
        toggleButton.setFocusable(false);
        toggleButton.setMargin(new Insets(0, 0, 0, 0));
        toggleButton.setContentAreaFilled(false);
        toggleButton.setIcon((errorIcon));
        toggleButton.setRolloverIcon((infoIcon));
        toggleButton.setSelectedIcon(warnIcon);
        toggleButton.setPressedIcon(warnIcon);
        toggleButton.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (toggleButton.isSelected()) {
                } else {
                }
            }
        });
        buttonsPanel.add(toggleButton);
        final JToggleButton toggleButton1 = new JToggleButton();
        toggleButton1.setFocusable(false);
        toggleButton1.setMargin(new Insets(0, 0, 0, 0));
        toggleButton1.setContentAreaFilled(false);
        toggleButton1.setIcon((errorIcon));
        toggleButton1.setRolloverIcon((infoIcon));
        toggleButton1.setSelectedIcon(warnIcon);
        toggleButton1.setPressedIcon(warnIcon);
        toggleButton1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (toggleButton1.isSelected()) {
                } else {
                }
            }
        });
        buttonsPanel.add(toggleButton1);
        panel.add(buttonsPanel, BorderLayout.EAST);
        panel.setBackground(text.getBackground());
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createMenu("Menu 1"));
        menuBar.add(createMenu("Menu 2"));
        menuBar.add(createMenu("Menu 3"));
        menuBar.add(new JSeparator());
        menuBar.add(new JButton("   Seach ....  "));
        menuBar.add(panel);
        menuBar.add(new JComboBox(new Object[]{"height", "length", "volume"}));
        menuBar.add(Box.createHorizontalGlue());
        menuBar.add(createMenu("About"));
        JFrame frame = new JFrame("MenuGlueDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar);
        frame.pack();
        frame.setVisible(true);
    }

    private JMenu createMenu(String title) {
        JMenu m = new JMenu(title);
        m.add("Menu item #1 in " + title);
        m.add("Menu item #2 in " + title);
        m.add("Menu item #3 in " + title);
        if (title.equals("About")) {
            m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }
        return m;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MenuGlueDemo menuGlueDemo = new MenuGlueDemo();
            }
        });
    }
}
于 2012-05-31T20:07:43.813 に答える
5

Component Borderに示されているアプローチを適応させることができる場合があります。これにより、「aJTextFieldと aJButtonを連携させる」ことができます。関連記事Text Promptも役に立つかもしれません。最後に、コンポーネントを結合する柔軟な方法として、ここJToolBarに示すを検討してください。

于 2012-05-31T23:00:28.477 に答える