MigLayout を使用すると、JTable に続く JButton が応答しなくなるのはなぜですか?また、これを修正する方法は何ですか?
質問
MigLayout で JTable に続いて JButton を使用することに関して、気が遠くなるような問題が発生しています。JTable を十分に超えて押し込まない限り、まったく応答しません (そうすれば正しく動作します)。
エンドユーザー製品に使用しているバージョンの MigLayout JAR と最新のバージョンの両方でコードを実行してみました。同じ結果。
問題を再現するサンプル コード (Main.java) を次に示します。
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
public class Main extends JFrame {
private JPanel panel;
private JTextField textField;
private JButton chooseButton;
private JTable table;
private JButton reloadButton;
private final DefaultTableModel model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
public Main() {
panel = new JPanel(new MigLayout("debug", "[][grow][]"));
setContentPane(panel);
setDefaultCloseOperation(EXIT_ON_CLOSE);
/*** First row ***/
// "File:"
panel.add(new JLabel("File:"));
// textField for filename
textField = new JTextField("No file selected yet!");
textField.setEditable(false);
panel.add(textField, "growx");
// "Choose..." button
chooseButton = new JButton("Choose...");
panel.add(chooseButton, "wrap, sg buttons");
/*** Second row ***/
panel.add(new JLabel());
table = new JTable(model);
model.setColumnIdentifiers(new String[] {"col title"});
JScrollPane scrollpane = new JScrollPane(table);
Dimension scrollpaneDimension = new Dimension(125, 110);
scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
table.setPreferredScrollableViewportSize(scrollpaneDimension);
table.setFillsViewportHeight(true);
panel.add(table.getTableHeader(), "grow");
panel.add(scrollpane, "grow");
reloadButton = new JButton("Reload");
panel.add(reloadButton, "top, wrap, sg buttons");
pack();
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
テーブルヘッダーとテーブル自体が同じレイアウトセルになることに関係があると思いますが、これについてはよくわかりません。
先ほども述べたように、JTable を超えてボタンを十分に押し込むと、ボタンは再び機能するようになります。次の行にドロップしても機能せず、もう 1 行下に移動する必要があります。
コードを実行するためにワークスペースで必要な唯一のライブラリは、 ミグレイアウト.
ご協力いただきました皆様、本当にありがとうございました!
M.ジョアニス
解決
MigLayoutの問題ではないと思いますが、 それ自体. 。線がなくてもボタンは正しく機能します
panel.add(table.getTableHeader(), "grow");
ヘッダーとテーブルの組み合わせをサブパネルにラップしてみるとよいでしょう。
JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
所属していません StackOverflow