2010-03-24 23 views
1

我在使用帶有MigLayout的JTable之後使用JButton時遇到了令人難以置信的問題。它完全沒有響應,除非我將它推到JTable的足夠遠處(然後它可以正常運行)。使用MigLayout,爲什麼在JTable之後的JButton沒有響應,以及如何解決這個問題?

我試着用最終用戶產品和最新版本的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,它將再次工作。如果我把它放在下一行,它不起作用,我不得不把它再往下移一行。

您需要在您的工作區中運行代碼的唯一庫是MigLayout

謝謝大家的幫助,非常感謝!

M. Joanis

+0

的問題不會有任何與MigLayout,對不起米格! – Joanis 2010-03-24 23:39:38

回答

2

我不認爲這是一個MigLayout問題,本身。該按鈕可以正常工作,而不線

panel.add(table.getTableHeader(), "grow"); 

您可以嘗試在子面板包裹頭/表組合:

JPanel sub = new JPanel(); 
sub.add(table.getTableHeader(), "grow"); 
sub.add(scrollpane, "grow"); 
panel.add(sub); 
+0

刪除該行似乎可以解決問題,無任何副作用。由於代碼就像我認爲它是必需的。如果我發現刪除該行會產生負面影響,我會嘗試將它們添加到自己的小型JPanel中,並且它也應該可以工作......非常感謝!這樣一個簡單的解決方案,但我們花了幾個小時試圖解決這個問題,從來沒有想過要刪除這條線。 – Joanis 2010-03-24 23:38:37

+0

我最初也忽略了它。當將'JTable'添加到'JScrollPane'時,它可能代表原作者的疏忽。 – trashgod 2010-03-25 14:06:14

相關問題