我已经阅读了数百次Oracle的API,在这里和其他地方阅读了无数文章,并且在jtable变得可见之后我仍然无法调整列的大小.
正如你可以推断的那样,我也试图使用jcheckbox来设置列的可见性.正如其他文章所述,使用addColumn和removeColumn不会将列返回到其原始位置.我之前使用过一个额外的类来保存列信息,例如列本身,它的标识符和原始索引.在列的可见性发生变化之后,添加/删除数据的问题也变得混乱了.我注意到数据不在正确的列中.因此,我选择设置列的minWidth,preferredWidth和maxWidth.
现在我的问题是,当setColumnVisible设置为true时,下面的代码不会调整列的宽度.用julius summner miller的话说,为什么会这样?
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
class run
{
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Viewer viewer = new Viewer();
JFrame jframe = new JFrame();
jframe.add(viewer);
jframe.createBufferStrategy(1); // required for dual monitor issues
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLocation(50,100);
jframe.pack();
jframe.setVisible(true);
}
});
}
}
class Viewer extends JPanel
{
static final long serialVersionUID = 0;
DefaultTableModel defaultTableModel;
JTable jtable;
JCheckBox jcheckBox[];
public Viewer() …Run Code Online (Sandbox Code Playgroud) 我试图让表格上的标题有自动换行.我已设法做到这一点,但第一个数据行正在扩展.该表的代码是:
public class GenerateTable extends JTable {
private JCheckBox boxSelect = new JCheckBox();
private JTableHeader hdGen;
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID = 1L;
int rowHeight = 0; // current max row height for this scan
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
/*
* row < 0 means header
*/
if(row >= 0) {
setWrapStyleWord(false);
return this;
}
setText((String) value);
setWrapStyleWord(true);
setLineWrap(true); …Run Code Online (Sandbox Code Playgroud) 如何获取多行JTable标题,其中标题列正确放大以适合某些文本然后换行到新行?
如下所示:
目前正在寻找上述要求会返回许多解决方案,而这些解决方案都没有真正解决问题:
http://www.javarichclient.com/multiline-column-header/
以上解决方案都建议使用HTML代码,例如:
String[] columnNames = {
"<html><center>Closing<br>Date</html>",
"<html><center>Open<br>Price</html>",
"<html>Third<br>column</html>"
};
Run Code Online (Sandbox Code Playgroud)
由于几个原因,该解决方案并不优雅,主要是因为在变量列名称的情况下,我需要将字符串传递给一个剥离空格并用<br>符号替换它们的函数,但是如果列文本包含出现的非常短的文本它自己的一条线.
我需要确定列的最小和最大长度,然后才能使文本居中成为可能,上述解决方案很快变得过度工程化并且难以管理.
http://www.java2s.com/Code/Java/Swing-Components/MultiLineHeaderTable.htm
http://www.java2s.com/Code/Java/Swing-Components/MultiLineHeaderExample.htm
以上解决方案需要手动创建一个标题数组,其中的单词已正确拆分,如下所示
public static Object[][] tableHeaders = new Object[][] {
new String[] { "Currency" },
new String[] { "Yesterday's", "Rate" },
new String[] { "Today's", "Rate" },
new String[] { "Rate", "Change" } };
Run Code Online (Sandbox Code Playgroud)
-要么-
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(
new Object[][] { { "a", "b", "c" }, { "A", "B", "C" } },
new Object[] { "1st\nalpha", …Run Code Online (Sandbox Code Playgroud) 我想在JScrollPane中设置一个具有固定num宽度的JTable的每一列,但我不能这样做,infoTable.getColumnModel().getColumn(0).setPreferredWidth(10);
我使用JScrollPane的默认布局,并在j2se 1.4中添加带有scrollPane的setViewPortView(infoTable)的表.我怎么能这样做?这是我的代码
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
public TableFrame() {
jScrollPane1 = new javax.swing.JScrollPane();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(0, 0, 0)));
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
this.setSize(new Dimension(600, 600));
this.jScrollPane1.setSize(500, 500);
this.getContentPane().add(this.jScrollPane1, BorderLayout.CENTER);
this.getContentPane().add(this.jButton1, BorderLayout.WEST);
table = new JTable(new javax.swing.table.DefaultTableModel(100, 2));
this.jScrollPane1.setViewportView(table);
table.getColumnModel().getColumn(0).setWidth(10);
}
Run Code Online (Sandbox Code Playgroud)
PS.回答的问题我需要拖动列来调整大小,所以我无法设置最大和最小尺寸
我如何将具有灵气外观和感觉的JTable Header的内容集中在一起?我试图使用DefaultTableCellHeaderRenderer,但它看起来像这样;

有没有办法让它们看起来像PARENT_ID列并居中?
我想在我的JTable-derrived类的标题中设置标签的垂直对齐方式.
我知道 setVerticalAlignment(SwingConstants.BOTTOM);
我的标题比字体高得多,我想把文字放在垂直中心的下方.
我怎么能这样做,而不是压倒一切paint()?
谢谢
我需要根据标题中的文本获得适当的表大小.它包含捷克名称的缩写,例如:"Po","Út","St",atc.但不显示这三个点.
我有这个代码:
width,height- 所有最小行/列大小的最大值
allWidth,allHeight- 应该是整个表的总宽度,高度
//GET DIMENSION
int width = 0;
int height = 0;
int allWidth, allHeight;
for (int col = 0; col < table.getColumnCount(); col++) {
TableColumn tableColumn = table.getTableHeader().getColumnModel().getColumn(col);
TableCellRenderer renderer = tableColumn.getHeaderRenderer();
if (renderer == null) {
renderer = table.getTableHeader().getDefaultRenderer();
}
Component component = renderer.getTableCellRendererComponent(table,
tableColumn.getHeaderValue(), false, false, -1, col);
width = Math.max(component.getPreferredSize().width, width);
table.getColumnModel().getColumn(col).setPreferredWidth(width);
}
allWidth = table.getColumnCount() * width;
for (int row = 0; row < table.getRowCount(); …Run Code Online (Sandbox Code Playgroud) 我需要隐藏 JTable 的标题栏吗?所以我只需要没有任何实际名称的行和列来显示给用户?有没有其他秋千来做类似的事情?我无法添加
jTable1.setTableHeader(null);
Run Code Online (Sandbox Code Playgroud)
在 initComponents 函数中的任何地方,我尝试过但出现错误?
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
public class table extends javax.swing.JFrame {
public table() {
initComponents();
jTable1.setTableHeader(null);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null}
},
new String [] {
"Name", "Age"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.Integer.class
}; …Run Code Online (Sandbox Code Playgroud) 我有一个JTabbedPane,其选项卡中包含三个表.的JTabbedPane,再次,是在JScrollPane.我想{"Client", "Action", "Location", "Value"}为每个表显示一个修复表头,它遵循模式.当我试图设置标题时ActionListener(见下文),我可以自由地使用其他方法(例如,最初设置标题).
其他SO帖子也解决了同样的问题,但我无法显示表头.唯一有效的方法是在上述表格中添加数据ActionListener.我不明白为什么标题没有显示,因为我将数据以String-matrix的形式与String表示标题的-array一起传递.
首先,这里是关于我的表的代码片段,它在GUI启动时执行(my initialize()-method).
tabbedPane = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13));
tabbedPane.setBackground(Color.WHITE);
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
tableBefore = new JTable();
tabbedPane.addTab(descrTableBefore, null, tableBefore, null);
tableBefore.setFont(new Font("Carlito", Font.PLAIN, 13));
tableBefore.setFocusable(false);
tableMainTest = new JTable();
tabbedPane.addTab(descrTableMain, null, tableMainTest, null);
tabbedPane.setEnabledAt(1, true);
tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13));
tableMainTest.setFocusable(false);
tableAfter = new JTable();
tabbedPane.addTab(descrTableAfter, null, tableAfter, null);
tableAfter.setFont(new Font("Carlito", Font.PLAIN, 13)); …Run Code Online (Sandbox Code Playgroud) 我写了一个自定义TableRowSorter,当你点击JTableHeaderfrom SortOrder.UNSORTED=> SortOrder.ASCENDING=> SortOrder.DESCENDING=> SortOrder.ASCENDING=> SortOrder.DESCENDING=> ...
to SortOrder.UNSORTED=> SortOrder.ASCENDING=> SortOrder.DESCENDING=> SortOrder.UNSORTED=> SortOrder.ASCENDING=> SortOrder.DESCENDING=> 时,它会改变排序顺序...
ADU_SortOrder.java
package order;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SortOrder;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> {
public ADU_SortOrder(M model) {
setModel(model);
}
boolean firstTime = true; //Needed in case there are any initial sort keys
int columnHolder = -1;
@Override
public void toggleSortOrder(int column) { …Run Code Online (Sandbox Code Playgroud) java ×10
jtable ×10
jtableheader ×10
swing ×10
jscrollpane ×1
jtabbedpane ×1
netbeans ×1
nimbus ×1
sorting ×1