[英]Jcheckbox inside a column in a JTable
我想創建一個表,每次添加新行時,還會添加某個列中的新復選框。 我已經完成了我的研究,但我仍然無法找到正確的答案,有時我發現很難理解其中的一些說明,這就是我的問題所在:
我在我的表的列(“e”)中添加了一個復選框,但它沒有顯示。 復選框僅顯示我是否單擊它。
package app.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.util.List;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;
import app.dao.item.impl.ReadItemFromDB;
import app.model.Item;
public class Inventory {
private JFrame inventoryframe;
private JTable table;
private JTextField textField;
private JCheckBox checkbox;
/**
* Launch the application.
*/
public void InventoryWindow() {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Inventory window = new Inventory();
window.inventoryframe.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Inventory() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
inventoryframe = new JFrame();
inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
inventoryframe.pack();
inventoryframe.getContentPane().setLayout(null);
JLabel lblInventory = new JLabel("Inventory Management");
lblInventory.setBounds(56, 32, 234, 27);
lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
inventoryframe.getContentPane().add(lblInventory);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(56, 130, 479, 249);
inventoryframe.getContentPane().add(scrollPane);
table = new JTable();
table.setShowVerticalLines(false);
table.setShowHorizontalLines(false);
table.setShowGrid(false);
table.setFillsViewportHeight(true);
table.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"t", "e"
}
));
scrollPane.setViewportView(table);
checkbox = new JCheckBox("borrow");
checkbox.setHorizontalAlignment(SwingConstants.CENTER);
checkbox.setBounds(360, 63, 97, 23);
TableColumn sportColumn = table.getColumnModel().getColumn(1);
sportColumn.setCellEditor(new DefaultCellEditor(checkbox));
doIt();
}
public void doIt(){
DefaultTableModel dtm = (DefaultTableModel) table.getModel();
dtm.getDataVector().removeAllElements();
dtm.getColumnClass(0);
ReadItemFromDB myReader = new ReadItemFromDB();
List<Item> newItemList = myReader.showItems();
@Override
public Class getColumnClass() {
return getValueAt(0, 1).getClass();
}
for (Item myNewItems : newItemList) {
Object[] rowData = new Object[1];
rowData[0] =myNewItems.getItemID();
dtm.addRow(rowData);
}
table.updateUI();
}
/*public Boolean getColumnClass(){
dtm.getValueAt(0, 1).getClass();
return null;
}*/
}
“對不起,請詳細說明一下?你能舉例說明嗎?”
無需自定義渲染器或編輯器。 只需@Override
表模型中的getColumnClass()
,使用DefaultTableModel
並使用該列的Boolean
類型。
下面有一個正在運行的exmpple,這是重要的部分
DefaultTableModel model = new DefaultTableModel(data, cols) {
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
這是完整的代碼
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TestTableCheck {
private static JTable createTable() {
Object[][] data = {{true, true, true}, {false, false, false}};
String[] cols = {"Bibitty", "Boppity", "Boo"};
DefaultTableModel model = new DefaultTableModel(data, cols) {
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
return table;
}
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,
new JScrollPane(createTable()),
"Table",
JOptionPane.PLAIN_MESSAGE);
}
}
這是你的代碼。 查看initialize()
方法,我在其中注釋掉了一些代碼,並在下面添加了我的代碼。 我也擺脫了doit()
方法。 另外你應該將pack()
作為方法的結尾,也可以使用setVisible()
。 我還添加了一個main
方法,因此它可以運行
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class Inventory {
private JFrame inventoryframe;
private JTable table;
private JTextField textField;
private JCheckBox checkbox;
/**
* Launch the application.
*/
public void InventoryWindow() {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Inventory window = new Inventory();
window.inventoryframe.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Inventory() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
inventoryframe = new JFrame();
inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
inventoryframe.getContentPane().setLayout(null);
JLabel lblInventory = new JLabel("Inventory Management");
lblInventory.setBounds(56, 32, 234, 27);
lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
inventoryframe.getContentPane().add(lblInventory);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(56, 130, 479, 249);
inventoryframe.getContentPane().add(scrollPane);
table = new JTable();
table.setShowVerticalLines(false);
table.setShowHorizontalLines(false);
table.setShowGrid(false);
table.setFillsViewportHeight(true);
/* table.setModel(new DefaultTableModel(
new Object[][]{},
new String[]{
"t", "e"
}
));*/
Object[][] data = {{true, true, true}, {false, false, false}};
String[] cols = {"Bibitty", "Boppity", "Boo"};
DefaultTableModel model = new DefaultTableModel(data, cols) {
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setModel(model);
scrollPane.setViewportView(table);
checkbox = new JCheckBox("borrow");
checkbox.setHorizontalAlignment(SwingConstants.CENTER);
checkbox.setBounds(360, 63, 97, 23);
TableColumn sportColumn = table.getColumnModel().getColumn(1);
sportColumn.setCellEditor(new DefaultCellEditor(checkbox));
inventoryframe.pack();
inventoryframe.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Inventory();
}
});
}
}
真的,這應該是另一個問題,但我今天感到很慷慨。
使用此測試類。 運行。 單擊該按鈕時,將打開Inventory
類。 您可能沒有在按鈕的actionPerformed
實例化Inventory
。 確保此類文件與Inventory
類文件位於同一個包中。 然后運行下面的課程。
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class InventoryTest extends JFrame {
public InventoryTest() {
setLayout(new GridBagLayout());
JButton show = new JButton("Show Inventory");
add(show);
show.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
new Inventory();
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new InventoryTest();
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.