firefox のアドレスバーのような textwidget/component を作成したいと思います。フィールド内に小さなボタンを配置できるテキストフィールドを意味します(キャンセル/リロードなど)
Textfield を最大化し、残りを右から左に配置するカスタム レイアウト マネージャーを作成して、JLayeredPane をカスタマイズしてみました。私の問題は、これによりペイントの問題が発生したことです。テキストフィールドに追加したアイテムが常に表示されるとは限りません。これは Jython に関連している可能性がありjava.lang.Integer(1)
ますJLayeredPane.add
。ただし、レイヤーは、ドキュメントに記載されているものとはまったく逆に並べられています。
JLayeredPane
これを解決するために、私は独自のクラスを派生させ、 paint
call を再定義しました。callpaintComponents
はすべてのコンポーネントを繰り返し処理し、ペイント メソッドを呼び出します。
ただし、常に更新をすぐに取得できるとは限りません。つまり、ボタンが非表示または部分的にしか表示されず、ボタンを操作できません。
- 画面上で更新を実際に確認するにはどうすればよいですか (バッファに隠されていますか?)
- ボタンを操作できるようにするにはどうすればよいですか?
- ボタンでテキストが隠れないように、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();
}
});
}
}