Java 如何获得JTable中列标题的字体和图形
我试图在JTable中获取列标题的图形和字体。要做到这一点,我使用的代码Java 如何获得JTable中列标题的字体和图形,java,swing,jtable,fontmetrics,Java,Swing,Jtable,Fontmetrics,我试图在JTable中获取列标题的图形和字体。要做到这一点,我使用的代码 Graphics g = myTable.getColumnModel().getColumn(i).getGraphics(); Font f = myTable.getColumnModel().getColumn(i).getFont(); 但是,这会产生“找不到符号”错误 此程序的完整代码如下所示 import javax.swing.*; import java.awt.*; import java.io.*
Graphics g = myTable.getColumnModel().getColumn(i).getGraphics();
Font f = myTable.getColumnModel().getColumn(i).getFont();
但是,这会产生“找不到符号”错误
此程序的完整代码如下所示
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.text.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.*;
import java.lang.Object.*;
import javax.swing.text.*;
import java.awt.FontMetrics;
import java.awt.Font;
import java.awt.Graphics;
public class JtableIe
{
JFrame myMainWindow = new JFrame("Compare Tables");
JPanel firstPanel = new JPanel();
JScrollPane myScrollTable;
JTable myTable;
JTextField srchFld1;
JTextField srchFld2;
TableRowSorter sorter;
JLabel srchLbl1 = new JLabel();
JLabel srchLbl2 = new JLabel();
DefaultTableModel model;
int testMaxMinSize = 0;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String []fontFamilies = ge.getAvailableFontFamilyNames();
public void runGUI()
{
myMainWindow.setBounds(10, 10, 1296, 756);
myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myMainWindow.setLayout(new GridLayout(1,1));
createFirstPanel();
myMainWindow.getContentPane().add(firstPanel);
myMainWindow.setVisible(true);
}
public void createFirstPanel()
{
firstPanel.setLayout(null);
srchLbl1.setLocation(0,0);
srchLbl1.setSize(150,26);
srchLbl1.setText("Name Search:");
firstPanel.add(srchLbl1);
srchLbl2.setLocation(660,0);
srchLbl2.setSize(150,26);
srchLbl2.setText("ID Search:");
firstPanel.add(srchLbl2);
String[] aHeaders = {"Name","ID","Number 1","Number 2","Time","Date"};
Object[][] aData = new Object[5][6];
///////Data////////
aData[0][0] = "John";
aData[0][1] = "JS96";
aData[0][2] = "1";
aData[0][3] = "186";
aData[0][4] = "1h 23m";
aData[0][5] = getJavaDate("12/11/2015");
aData[1][0] = "David";
aData[1][1] = "DB36";
aData[1][2] = "2";
aData[1][3] = "111852";
aData[1][4] = "2h 55m";
aData[1][5] = getJavaDate("12/11/2020");
aData[2][0] = "Daniel";
aData[2][1] = "DK73";
aData[2][2] = "3";
aData[2][3] = "2921";
aData[2][4] = "1h 55m";
aData[2][5] = getJavaDate("12/11/2014");
aData[3][0] = "Janis";
aData[3][1] = "JW84";
aData[3][2] = "4";
aData[3][3] = "6512";
aData[3][4] = "12h 26m";
aData[3][5] = getJavaDate("13/11/2015");
aData[4][0] = "Adam";
aData[4][1] = "AF98";
aData[4][2] = "5";
aData[4][3] = "7524";
aData[4][4] = "5h 47m";
aData[4][5] = getJavaDate("11/11/2015");
//////////////
model = new DefaultTableModel(aData, aHeaders)
{
@Override
public Class<?> getColumnClass(int column)
{
switch (column)
{
case 5: return Date.class;
default: return Object.class;
}
}
@Override
public boolean isCellEditable(int row, int column)
{
return false;//all cells false
}
};
myTable = new JTable(model);
myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
myTable.setAutoCreateRowSorter(true);
sorter = new TableRowSorter(myTable.getModel());
List sortKeys = new ArrayList();
sortKeys.add(new RowSorter.SortKey(5, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
setRenderers();
myTable.setRowSorter(sorter);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );
myTable.setDefaultRenderer(Object.class, centerRenderer);
DefaultRowSorter sorter = (DefaultRowSorter) myTable.getRowSorter();
setMinPrefMax();
myScrollTable = new JScrollPane(myTable);
myScrollTable.setSize(1296,756);
myScrollTable.setLocation(0,25);
System.out.println("Creating compare table");
srchFld1 = new JTextField(10);
srchFld1.setSize(550,26);
srchFld1.setLocation(100,0);
srchFld1.setToolTipText("Enter Name");
firstPanel.add(srchFld1);
srchFld2 = new JTextField(10);
srchFld2.setSize(550,26);
srchFld2.setLocation(740,0);
srchFld2.setToolTipText("Enter ID");
firstPanel.add(srchFld2);
//////////////////////
Document doc = srchFld1.getDocument();
DocumentListener listener = new DocumentListener()
{
@Override
public void insertUpdate(DocumentEvent e)
{
newFilter();
}
@Override
public void removeUpdate(DocumentEvent e)
{
newFilter();
}
@Override
public void changedUpdate(DocumentEvent e)
{
newFilter();
}
};
doc.addDocumentListener(listener);
///////////////
Document docb = srchFld2.getDocument();
DocumentListener listenerb = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e)
{
newFilter();
}
@Override
public void removeUpdate(DocumentEvent e)
{
newFilter();
}
@Override
public void changedUpdate(DocumentEvent e)
{
newFilter();
}
};
docb.addDocumentListener(listenerb);
///////////////
firstPanel.add(myScrollTable);
}
public void setMinPrefMax()
{
for (int i = 0; i < myTable.getColumnCount(); i++)
{
String Hello = myTable.getColumnModel().getColumn(i).getHeaderValue()+"";
System.out.println(Hello);
Graphics g = myTable.getColumnModel().getColumn(i).getGraphics();
Font f = myTable.getColumnModel().getColumn(i).getFont();
FontMetrics metrics = g.getFontMetrics(f);
int minLength = metrics.stringWidth(Hello)+10;
System.out.println(minLength);
myTable.getColumnModel().getColumn(i).setMinWidth(minLength);
}
}
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
private void setRenderers()
{
DateRenderer dr = new DateRenderer();
dr.setHorizontalAlignment(SwingConstants.CENTER);
myTable.setDefaultRenderer(Date.class, dr);
}
private Date getJavaDate(String s)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date d = sdf.parse(s);
return d;
}
catch (ParseException ex)
{
Logger.getLogger(TableBasic.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
private void newFilter()
{
RowFilter rf = null;
try
{
List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter("(?i)"+srchFld1.getText(), 0));
filters.add(RowFilter.regexFilter("(?i)"+srchFld2.getText(), 1));
rf = RowFilter.andFilter(filters);
}
catch (java.util.regex.PatternSyntaxException e)
{
return;
}
sorter.setRowFilter(rf);
}
public static void main(String[] args)
{
JtableIe ji = new JtableIe();
ji.runGUI();
}
private class DateRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable myTable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(myTable, value, isSelected, hasFocus, row, column);
if (!(value instanceof Date)) {
return this;
}
setText(DATE_FORMAT.format((Date) value));
return this;
}
}
}
import javax.swing.*;
导入java.awt.*;
导入java.io.*;
导入java.lang.*;
导入java.awt.event.*;
导入javax.swing.event.*;
导入java.util.List;
导入java.util.ArrayList;
导入java.util.Comparator;
导入java.text.*;
导入java.util.*;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.table.*;
导入java.lang.Object.*;
导入javax.swing.text.*;
导入java.awt.FontMetrics;
导入java.awt.Font;
导入java.awt.Graphics;
公共类JtableIe
{
JFrame myMainWindow=新JFrame(“比较表”);
JPanel firstPanel=新的JPanel();
JScrollPane myScrollTable;
JTable-myTable;
JTextField srchFld1;
JTextField srchFld2;
台式分拣机;
JLabel srchLbl1=新的JLabel();
JLabel srchLbl2=新的JLabel();
默认表格模型;
int testMaxMinSize=0;
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
字符串[]fontFamilies=ge.getAvailableFontFamilyNames();
公营机构
{
myMainWindow.setBounds(10,101296756);
myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(1,1));
createFirstPanel();
myMainWindow.getContentPane().add(第一个面板);
myMainWindow.setVisible(true);
}
public void createFirstPanel()
{
firstPanel.setLayout(null);
srchLbl1.setLocation(0,0);
srchLbl1.设置大小(150,26);
srchLbl1.setText(“名称搜索:”);
firstPanel.add(srchLbl1);
srchLbl2.设置位置(660,0);
srchLbl2.设置大小(150,26);
srchLbl2.setText(“ID搜索:”);
firstPanel.add(srchLbl2);
字符串[]aHeaders={“Name”、“ID”、“Number 1”、“Number 2”、“Time”、“Date”};
对象[][]aData=新对象[5][6];
///////资料////////
aData[0][0]=“John”;
aData[0][1]=“JS96”;
aData[0][2]=“1”;
aData[0][3]=“186”;
aData[0][4]=“1h 23m”;
aData[0][5]=getJavaDate(“2015年11月12日”);
aData[1][0]=“David”;
aData[1][1]=“DB36”;
aData[1][2]=“2”;
aData[1][3]=“111852”;
aData[1][4]=“2h 55m”;
aData[1][5]=getJavaDate(“2020年11月12日”);
aData[2][0]=“Daniel”;
aData[2][1]=“DK73”;
aData[2][2]=“3”;
aData[2][3]=“2921”;
aData[2][4]=“1h 55m”;
aData[2][5]=getJavaDate(“2014年11月12日”);
aData[3][0]=“Janis”;
aData[3][1]=“JW84”;
aData[3][2]=“4”;
aData[3][3]=“6512”;
aData[3][4]=“12h 26m”;
aData[3][5]=getJavaDate(“2015年11月13日”);
aData[4][0]=“亚当”;
aData[4][1]=“AF98”;
aData[4][2]=“5”;
aData[4][3]=“7524”;
aData[4][4]=“5h 47m”;
aData[4][5]=getJavaDate(“2015年11月11日”);
//////////////
模型=新的DefaultTableModel(aData、aHeaders)
{
@凌驾
公共类getColumnClass(int列)
{
开关(列)
{
案例5:返回日期.class;
默认值:return Object.class;
}
}
@凌驾
公共布尔值可编辑(int行,int列)
{
return false;//所有单元格为false
}
};
myTable=新的JTable(模型);
myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
myTable.setAutoCreateRowSorter(真);
sorter=newtablerowsorter(myTable.getModel());
List sortKeys=new ArrayList();
添加(新的行排序器.SortKey(5,排序器.升序));
分拣机设置快捷键(快捷键);
setRenders();
myTable.setRowSorter(分拣机);
DefaultTableCellRenderer centerRenderer=新的DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setDefaultRenderer(Object.class,centerRenderer);
DefaultRowSorter-sorter=(DefaultRowSorter)myTable.getRowSorter();
setMinPrefMax();
myScrollTable=新的JScrollPane(myTable);
myScrollTable.setSize(1296756);
myScrollTable.setLocation(0,25);
System.out.println(“创建比较表”);
srchFld1=新的JTextField(10);
srchFld1.setSize(550,26);
srchFld1.设置位置(100,0);
srchFld1.setToolTipText(“输入名称”);
firstPanel.add(srchFld1);
srchFld2=新的JTextField(10);
srchFld2.setSize(550,26);
srchFld2.设置位置(740,0);
srchFld2.setToolTipText(“输入ID”);
firstPanel.add(srchFld2);
//////////////////////
Document doc=srchFld1.getDocument();
DocumentListener=新建DocumentListener()
{
@凌驾
公共作废插入更新(文档事件e)
{
newFilter();
}
@凌驾
公共作废移除更新(文档事件e)
{
newFilter();
}
@凌驾
公共作废更改日期(记录事件e)
{
newFilter();
}
};
doc.addDocumentListener(listener);
///////////////
Document docb=srchFld2.getDocument();
DocumentListener listenerb=新的DocumentListener(){
@凌驾
公共作废插入更新(文档事件e)
{
newFilter();
}
@凌驾
公共作废移除更新(文档事件e)
{
newFilter();
}
@凌驾
公共v
import java.awt.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.table.*;
public class TableBasic {
private JFrame frame = new JFrame();
private String[] columnNames = {"Date", "String", "Long", "Boolean"};
private Object[][] data = {
{getJavaDate("13-11-2020"), "A", new Double(1), Boolean.TRUE},
{getJavaDate("13-11-2018"), "B", new Double(2), Boolean.FALSE},
{getJavaDate("12-11-2015"), "C", new Double(9), Boolean.TRUE},
{getJavaDate("12-11-2015"), "D", new Double(4), Boolean.FALSE}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
private JScrollPane scrollPane = new JScrollPane(table);
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
public TableBasic() {
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setAutoCreateRowSorter(true);
setRenderers();
// DefaultRowSorter has the sort() method
table.getRowSorter().toggleSortOrder(0);
frame.add(scrollPane);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void setRenderers() {
//TableColumnModel m = table.getColumnModel();
//"Integer", "String", "Interger", "Double", "Boolean", "Double", "String", "Boolean", "Date"
table.setDefaultRenderer(Date.class, new DateRenderer());
}
private Date getJavaDate(String s) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date d = sdf.parse(s);
return d;
} catch (ParseException ex) {
Logger.getLogger(TableBasic.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TableBasic frame = new TableBasic();
}
});
}
private class DateRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!(value instanceof Date)) {
return this;
}
setText(DATE_FORMAT.format((Date) value));
return this;
}
}
}
for (int i = 0; i < myTable.getColumnCount(); i++)
{
JTableHeader tableHeader = myTable.getTableHeader();
FontMetrics headerFontMetrics = tableHeader.getFontMetrics(tableHeader.getFont());
if(tableHeader == null)
{
return;
}
int Test = headerFontMetrics.stringWidth(myTable.getColumnName(i));
System.out.println("The width of the column header "+i+" is: "+Test);
int minLength = Test+20;
myTable.getColumnModel().getColumn(i).setMinWidth(minLength);
}
public static int GetScreenWorkingWidth()
{
return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width;
}
public void setMinPrefMax()
{
for(int i = 0; i < myTable.getColumnCount(); i++)
{
////Min
System.out.println("Column "+i);
JTableHeader tableHeader = myTable.getTableHeader();
FontMetrics headerFontMetrics = tableHeader.getFontMetrics(tableHeader.getFont());
if(tableHeader == null)
{
return;
}
int Test = headerFontMetrics.stringWidth(myTable.getColumnName(i));
System.out.println("The width of the column header "+i+" is: "+Test);
int minLength = Test+20;
myTable.getColumnModel().getColumn(i).setMinWidth(minLength);
////Pref
for(int row=0; row<myTable.getRowCount(); row++)
{
Font fontF1 = myTable.getFont();
FontMetrics cVFontMetrics = myTable.getFontMetrics(fontF1);
System.out.println(myTable.getValueAt(row, i));
String Hello = myTable.getValueAt(row, i)+"";
int Test2 = cVFontMetrics.stringWidth(Hello);
System.out.println("The length of this string is: "+Test2);
if(Test2>testMaxPrefSize)
{
testMaxPrefSize = Test2;
}
}
System.out.println("The maximum value for cells in column "+i+" is: "+testMaxPrefSize);
myTable.getColumnModel().getColumn(i).setPreferredWidth(testMaxPrefSize+20);
////Max
int testMaxSize = testMaxPrefSize+300;
if(testMaxSize>GetScreenWorkingWidth())
{
myTable.getColumnModel().getColumn(i).setMaxWidth(GetScreenWorkingWidth());
}
else
{
myTable.getColumnModel().getColumn(i).setMaxWidth(testMaxSize);
}
testMaxPrefSize=0;
}
}