我有两个问题
1.我想在鼠标点击时改变JTable Cell的颜色。我添加了一个监听器,就像在两种颜色之间切换一样,如果它当前是绿色的话,它应该转向其他点击的打击
String[][] data = new String[rows][columns];
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
table.addMouseListener(new CellClickListener());
// Using following MouseListener
public class CellClickListener extends MouseAdapter{
public void mouseClicked(MouseEvent e) {
JTable target = (JTable)e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();
// How to getCell object here and change its background color to clicked cell
}
}
2.如何设置不同的列宽,例如firstColumn.setWidth(20)
,secondColumn.setWidth(40)
。我已经停用了自动调整大小table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
答案 0 :(得分:2)
您必须创建自己的CellRenderer并使用MouseAdapter
这是一个SSCCE来阐明我的意思:
希望它有帮助=)
public class JTableTest extends JFrame {
private JPanel contentPane;
private JScrollPane scrollPane;
private JTable table;
private int col;
private int rowz;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
teste frame = new teste();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public JTableTest() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] { { "", null, null, "" }, { null, null, null, null }, { null, null, null, "" },
{ null, null, null, null }, }, new String[] { "Column 0", "Column 1", "Column 2", "Column 3" }));
table.getColumnModel().getColumn(0).setMinWidth(200); // Here's how to
// change a
// column width
scrollPane.setViewportView(table);
table.setDefaultRenderer(Object.class, new CustomModel());
table.addMouseListener(new CustomListener());
}
public class CustomListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent arg0) {
super.mouseClicked(arg0);
// Select the current cell
rowz = table.getSelectedRow();
col = table.getSelectedColumn();
// Repaints JTable
table.repaint();
}
}
public class CustomModel extends DefaultTableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color c = Color.WHITE;
if (isSelected && row == rowz & column == col)
c = Color.GREEN;
label.setBackground(c);
return label;
}
}
}
答案 1 :(得分:1)
我已经在同一个问题上工作了好几天。 我已经开发了一般功能
setColorAtCell(Jtable table,Color colr,int row,int column)
可以更好地完成任务。
以下是适用于上述问题的代码 您也可以查看我的github
中的代码import java.awt.Color;
import java.awt.Component;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class ChangeCellColorJTable extends javax.swing.JFrame {
public static Color[][] table_color = new Color[40][40];
//this array is used to change the table color
public static Object[][] table_value = new Object[40][40];
//this array is used to change the table values
public ChangeCellColorJTable() {
initComponents();
initTable(); //Initializing the table
refreshtable(mytable,1,1);
}
public static void initTable(){
int i,j;
Object[][] data = new Object[][]{
{10,10},
{11,11},
{12,12},
{13,13}
};
for(i = 0;i < 4;i++ ){
for(j = 0;j<2;j++){
mytable.setValueAt(data[i][j], i, j); //Setting values in Jtable
table_value[i][j] = data[i][j]; //Setting same values table array
}
}
for(i = 0;i<4;i++){
for(j = 0;j<2;j++){
table_color[i][j] = Color.getColor("#f9f4bd"); //Setting initial color of the table
//Not Mandatory
}
}
}
private void initComponents() { //These code is to initialize the Components to be Displayed
jScrollPane1 = new javax.swing.JScrollPane();
mytable = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
mytable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null},
{null, null},
{null, null},
{null, null}
},
new String [] {
"Title 1", "Title 2"
}
));
mytable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
mytableMouseClicked(evt);
}
});
jScrollPane1.setViewportView(mytable);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(13, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(13, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}
//MouseClicked on Table Event
private void mytableMouseClicked(java.awt.event.MouseEvent evt) { //MouseClickEvent
int row,column;
Color colr = Color.CYAN;
JTable target = (JTable)evt.getSource();
row = target.getSelectedRow();
column = target.getSelectedColumn();
setColorAtCell(mytable,colr,row,column);
}
//referesh table function by call custom_renderer
public static void refreshtable(JTable table,int row,int column){
int i;
try{
mytable.getColumnModel().getColumn(column).setCellRenderer(new Custom_Renderer());
}catch(Exception e){
JOptionPane.showMessageDialog(null, "error there");
}
}
//this function could be used for changing the color at specific cell
//Provided we use a Table Color Array (table_color)
public static void setColorAtCell(JTable table,Color colr,int row,int column){
table_color[row][column] = colr;
refreshtable(table,row,column);
refreshtable(table,row,column);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ChangeCellColorJTable().setVisible(true);
}
});
}
private javax.swing.JScrollPane jScrollPane1;
public static javax.swing.JTable mytable;
}
class Custom_Renderer extends DefaultTableCellRenderer
{
Custom_Renderer(){
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object value_present = table.getValueAt(row, column);
Object value_in_table = ChangeCellColorJTable.table_value[row][column];
if(value_present.equals(value_in_table)){ //This condition I used so that the Specific cell come into the condition
Color color = ChangeCellColorJTable.table_color[row][column];
cellComponent.setBackground(color);
}else{
cellComponent.setBackground(Color.blue);
}
return cellComponent;
}
}