我有一个JTable
对象,显示预先选择的MySQL表的所有内容。正如您所知,这个类提供了诸如列自动调整大小之类的功能:我想创建一个过程来计算表中包含的所有单元格的宽度之和,如果结果是次要的,则打开AUTO RESIZE模式而不是preferredWidth
。我一直试图关注数百个在线指南,但我的程序仍然无效:
public void setTableColumnPreferredWidth(javax.swing.JTable aTable)
{
int width = 0;
int TotalWidth = 0;
for (int row = 0; row < aTable.getRowCount(); row++)
{
for (int myColumn=0;myColumn < aTable.getColumnCount();myColumn++)
{
TableCellRenderer renderer = aTable.getCellRenderer(row, myColumn);
Component comp = aTable.prepareRenderer(renderer, row, myColumn);
width = Math.max (comp.getPreferredSize().width, width);
aTable.getColumnModel().getColumn(myColumn).setPreferredWidth(width);
}
}
for (int I=0;I<aTable.getColumnModel().getColumnCount();I++)
TotalWidth += aTable.getColumnModel().getColumn(I).getPreferredWidth();
int maximum = 0;
if (MainTable.getAutoResizeMode() == MainTable.AUTO_RESIZE_ALL_COLUMNS)
maximum = MainTable.getPreferredSize().width;
else
{
int PreviousAutoresize = MainTable.getAutoResizeMode();
MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS);
maximum = MainTable.getPreferredSize().width;
MainTable.setAutoResizeMode(PreviousAutoresize);
}
if (maximum < TotalWidth)
MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS);
else
MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_OFF);
}
感谢您的关注。
答案 0 :(得分:1)
我想创建一个程序来计算JTable中包含的所有单元格的宽度之和,如果结果小于其preferredWidth,则打开AUTO RESIZE模式
auto resize属性应该基于显示表格的滚动窗格的视口中的可用空间。
这需要在滚动窗格的大小发生变化时动态完成。
您可以在滚动窗格中添加ComponentListener
并收听componentResized
事件。然后你进行计算:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BorderLayout() );
JTable table = new JTable(5, 5);
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );
scrollPane.addComponentListener( new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
JScrollPane scrollPane = (JScrollPane)e.getComponent();
JTable table = ((JTable)scrollPane.getViewport().getView());
int tableWidth = table.getPreferredSize().width;
int viewportWidth = scrollPane.getViewport().getSize().width;
if (tableWidth < viewportWidth)
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
else
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
});
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
或者另一种选择是覆盖JTable的一些默认布局处理,如下所示:JTable resize only selected column when container size changes