2013-03-18 72 views
0

我试图创建一个包含N行和2列的面板,其中第一列是具有可变长度但在一定范围内的标签(它根据语言改变长度),而第二列包含可能非常长的文本的字段。详细信息具有可变长度字段的JPanel

我使用NetBeans使用GridBagLayout的尝试,不过结果缩放面板或JPanel的截图下方添加很长的领域.. 到明白我的意思的时候是凌乱:

enter image description here

我希望左列与左边界隔开,第一列不会调整为比最长标签更小的值(标签必须始终可读),而第二列应该可视化到其可用的水平空间并且然后显示点(而不是裁剪文本)。

什么也同样令人厌烦的是,虽然我定义西北的方位面板显示垂直于中心

编辑齐:我已经使用TableColumnAdjuster使用表行,而不是标签我的价值观,这样我可以选择用鼠标的值。 我仍然有但行适合文本的长度,而不是包含面板:

public class TestPanel extends JPanel 
{ 
    private static ArrayList<String> columnNames = new ArrayList<>(); 
    static JTable table; 
    MyTableModel myTableModel = new MyTableModel(); 

    static class MyTableModel extends AbstractTableModel 
    { 
     private String[] columnNames = 
     { 
      "Name", "Value" 
     }; 
     private Object[][] data = 
     { 
      { "Subject", "very very very very very very very very very very very very very very very very long subject"}, 
      { "Date", "" }, 
      { "Location", "" }, 
      { "Status", "" }, 
      { "Notes", "" } 
     }; 

     @Override 
     public int getColumnCount() 
     { return columnNames.length; } 

     @Override 
     public int getRowCount() 
     { return data.length; } 

     @Override 
     public String getColumnName(int col) 
     { return columnNames[col]; } 

     @Override 
     public Object getValueAt(int row, int col) 
     { return data[row][col]; } 

     @Override 
     public Class getColumnClass(int c) 
     { return getValueAt(0, c).getClass(); } 

     @Override 
     public boolean isCellEditable(int row, int col) 
     { return false; } 

     @Override 
     public void setValueAt(Object value, int row, int col) 
     {  } 
    } 

    public TestPanel() 
    { 
     table = new JTable(myTableModel); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     TableColumnAdjuster tca = new TableColumnAdjuster(table); 
     tca.adjustColumns(); 

     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(table); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.weighty = 1.0; 
     constraints.fill = GridBagConstraints.VERTICAL; 
     panel.add(Box.createGlue(), constraints); 
     add(panel); 
    } 

    public static void main(String args[]) 
    { 
     JFrame frame = new JFrame(); 
     frame.setContentPane(new TestPanel()); 
     frame.setSize(300, 800); 
     frame.setVisible(true); 
    } 
} 

而TableColumnAdjuster是TableColumnAdjuster ..我所得到的仍然是如下

enter image description here

+0

为什么不直接使用一个JTable? – RudolphEst 2013-03-18 11:38:43

回答

1

您可以使用带两列的JTable和一个TableColumnAdjusterTableCellRenderer,以便将列的宽度调整为最长的内容。

+0

我尝试过使用TableColumnAdjuster,但是现在尺寸会根据文本长度进行调整,而不是根据面板的水平尺寸进行调整。请参阅编辑我的问题 – dendini 2013-03-18 14:45:48

+0

添加JScrollPane。您的JFrame的宽度太短。尝试'frame.setSize(800,800);'和这个: 'public TestPanel(){ table = new JTable(myTableModel); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumnAdjuster tca = new TableColumnAdjuster(table); tca.adjustColumns(); JPanel panel = new JPanel(new BorderLayout()); JScrollPane scp = new JScrollPane(table); panel.add(scp,BorderLayout.CENTER); add(panel); } ' – 2013-03-18 16:01:48

1

实现它的一种方法是在“嵌套布局”中使用3个面板。面板将按如下布置。

  1. 用途BorderLayout用于外面板,它包含面板2 & 3.
  2. 用单一的柱GridLayout - 投入BorderLayout.LINE_START
  3. 用单一的柱GridLayout - 投入BorderLayout.CENTER
2

您可能会错误地使用GridBagLayout

  1. 要推送所有内容到顶部,或者包裹GridBagLayout面板到另一个面板(如在NORTH位置BorderLayout面板),或在这需要所有的额外空间
  2. 对于底部添加的成分第一列中的所有组件都将weightx设置为0,而将第二列中的组件设置为大于0的值。
  3. 要添加的左边框和标签之间的一些空间,只需使用insets

下面是一个例子说明这一点:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.Random; 

import javax.swing.Box; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Gridbag { 

    public void initUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     Random random = new Random(); 
     for (int i = 0; i < 10; i++) { 
      String label = "Label " + (i + 1); 
      StringBuilder fieldValue = new StringBuilder(); 
      int r = 1 + random.nextInt(4); 
      for (int j = 0; j < r; j++) { 
       fieldValue.append("Some long value that may be very long in some cases"); 
      } 
      addField(panel, label, fieldValue.toString()); 
     } 
     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.weighty = 1.0; 
     constraints.fill = GridBagConstraints.VERTICAL; 
     panel.add(Box.createGlue(), constraints); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void addField(JPanel panel, String label, String fieldValue) { 
     GridBagConstraints labelGBC = new GridBagConstraints(); 
     labelGBC.insets = new Insets(0, 5, 0, 5); 
     labelGBC.anchor = GridBagConstraints.EAST; 
     GridBagConstraints fieldGBC = new GridBagConstraints(); 
     fieldGBC.gridwidth = GridBagConstraints.REMAINDER; 
     fieldGBC.weightx = 1.0; 
     fieldGBC.anchor = GridBagConstraints.WEST; 
     panel.add(new JLabel(label), labelGBC); 
     panel.add(new JLabel(fieldValue), fieldGBC); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Gridbag().initUI(); 
      } 
     }); 
    } 

} 
+0

我试着用你的解决方案与JTable相结合..但它不工作,因为水平尺寸仍然由JFrame裁剪..请参阅我上面的编辑.. – dendini 2013-03-18 14:47:03

+0

@dendini这种方法是相当不同你首先暴露的一个。如果你能创建一个新的问题会更合适。 FWIW:除非绝对必要,否则不要使用'static',JTable应该包装在JScrollPane中。不知道这个TableColumnAdjuster应该做什么。 – 2013-03-18 15:13:21

+0

*“要在左边框和标签之间添加一些空格,只需使用插图”*为什么不在面板中添加EmpytyBorder? – 2013-03-19 12:08:46