最近、Java + SwingでUIを構築する作業を開始しました。現在、JTextFieldをFlowLayoutでJPanelに配置して問題が発生しています。Swing:JPanel内のJTextField、再描画の問題
私の例では、ボタン付きのパネルを含むウィンドウがあります。このボタンをクリックすると、JTextFieldを含むJPanelから派生したコンポーネントが追加されます。
問題は、JTextFieldに入力すると更新されない(サイズが変更されない)ということです。しかし、ウィンドウのサイズを変更したり、ウィンドウ/パネルの再描画を強制する他の操作を行うと、テキストフィールドのサイズが変更されます(私は自動的に何が起こるか)。
基本クラスをJPanelからJTextFieldに変更すると、これは達成しようとする方法で機能しますが、子コンポーネントを置く利点を得るために、JPanelを基本クラスとして持つ必要があります。
私はここで別の問題をチェックしているだけでなく、Googleが解決策を見つけようとしているが、私にとってはうまくいかなかった。私はvalidate/invalidate/revalidate/repaintをさまざまな組み合わせで試してみましたが、それぞれの型付けされた文字の再検証を強制しようとしています。これまでのところ、レイアウトマネージャとは関係があります。
スイングUI、レイアウト管理、再描画がどのように機能しているのか、私はそのことがどのように機能するのか理解してもらえますか?
また、自分のコードに関する特定の問題について誰かが私を助けることができたらうれしいです。
ありがとうございます!ここで
は、以下の私のコードです:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class TagVisual extends JPanel /*JTextField*/ {
private JTextField editField;
public TagVisual() {
FlowLayout layout = new FlowLayout();
layout.setHgap(0);
layout.setVgap(0);
setLayout(layout);
editField = new JTextField();
editField.setBackground(Color.RED);
editField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
editField.setSize(editField.getSize());
editField.revalidate();
remove(editField);
add(editField);
revalidate();
repaint();
}
});
add(editField, FlowLayout.LEFT);
}
public void place(JPanel panel) {
panel.add(this);
editField.grabFocus();
}
}
public class MainWindow {
private JPanel mainPanel;
private JButton btnPlace;
private JFrame frame;
public MainWindow(JFrame frame) {
mainPanel = new JPanel(new FlowLayout());
btnPlace = new JButton();
btnPlace.setText("Place");
mainPanel.add(btnPlace);
this.frame = frame;
btnPlace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TagVisual v = new TagVisual();
v.place(mainPanel);
mainPanel.revalidate();
mainPanel.repaint();
mainPanel.updateUI();
frame.revalidate();
frame.repaint();
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("TextFieldUpdateIssue");
frame.setContentPane(new MainWindow(frame).mainPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
したがって、入力したテキストに基づいてテキストフィールドのサイズを大きくしたいですか?これは正常な動作ではありません。ユーザーは私が非常に厄介なことに気付くでしょう... – Ansharja
はい、それは私が欲しいものです。私は入力時にサイズが大きくなることが予想されるタグエディタコンポーネントを作成しています。 –
ようこそ。投稿する[mcve]。このコードは実行されません( 'btnPlace'と' mainPanel'は決して初期化されず、フレームに追加されません)。 – c0der