如何在JTable里面添加JButton按钮,求大神指点

如何在JTable里面添加JButton按钮,求大神指点,第1张

已山寨,复制粘贴即可

import java.awt.BorderLayout

import java.awt.Component

import java.awt.Dimension

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import javax.swing.AbstractCellEditor

import javax.swing.BorderFactory

import javax.swing.JButton

import javax.swing.JComponent

import javax.swing.JFrame

import javax.swing.JPanel

import javax.swing.JScrollPane

import javax.swing.JTable

import javax.swing.ListSelectionModel

import javax.swing.table.AbstractTableModel

import javax.swing.table.TableCellEditor

import javax.swing.table.TableCellRenderer

public class JButtonTable extends JPanel

{

private static final long serialVersionUID = 1L

public JButtonTable ()

{

super (new BorderLayout ())

JTable table = new JTable (new Model ())

table.setDefaultRenderer (JButton.class, new JButtonRender ())

table.setDefaultEditor (JButton.class, new JButtonEditor ())

table.setPreferredScrollableViewportSize (new Dimension (500, 70))

table.setFillsViewportHeight (true)

table.setSelectionMode (ListSelectionModel.SINGLE_SELECTION)

JScrollPane scrollPane = new JScrollPane (table)

add (scrollPane, BorderLayout.CENTER)

}

class Model extends AbstractTableModel

{

private static final long serialVersionUID = 1L

JButton modify = new JButton ("修改")

JButton delete = new JButton ("删除")

private String[] columnNames = { "物品编号", "物品名称", "物品数量", "备注", "修改?", "删除?" }

private Object[][] data = { { 1, "水管", 20, "根", modify, delete }, { 2, "窗框", 50, "组", modify, delete },

{ 3, "门", 50, "扇", modify, delete } }

public int getColumnCount ()

{

return columnNames.length

}

public int getRowCount ()

{

return data.length

}

public String getColumnName ( int col )

{

return columnNames[col]

}

public Object getValueAt ( int row, int col )

{

return data[row][col]

}

public Class<? extends Object> getColumnClass ( int c )

{

return getValueAt (0, c).getClass ()

}

public boolean isCellEditable ( int row, int col )

{

return true

}

public void setValueAt ( Object value, int row, int col )

{

data[row][col] = value

fireTableCellUpdated (row, col)

}

}

private static void createAndShowGUI ()

{

JFrame frame = new JFrame ("JButtonTable")

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)

JComponent newContentPane = new JButtonTable ()

newContentPane.setOpaque (true)

frame.setContentPane (newContentPane)

frame.pack ()

frame.setLocationRelativeTo (null)

frame.setResizable (false)

frame.setVisible (true)

}

public static void main ( String[] args )

{

javax.swing.SwingUtilities.invokeLater (new Runnable ()

{

public void run ()

{

createAndShowGUI ()

}

})

}

}

class JButtonRender extends JButton implements TableCellRenderer

{

private static final long serialVersionUID = 1L

protected static final String MODIFY = "修改"

protected static final String DELETE = "删除"

public JButtonRender ()

{

setOpaque (true)

}

@Override

public Component getTableCellRendererComponent ( JTable table, Object jButton, boolean isSelected,

boolean hasFocus, int row, int column )

{

if (column == 4)

{

setText (MODIFY)

}

else if (column == 5)

{

setText (DELETE)

}

setBorder (BorderFactory.createEmptyBorder ())

return this

}

}

class JButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener

{

private static final long serialVersionUID = 1L

protected static final String MODIFY = "修改"

protected static final String DELETE = "删除"

JButton button

public JButtonEditor ()

{

button = new JButton ()

button.addActionListener (this)

}

@Override

public Object getCellEditorValue ()

{

return button

}

@Override

public void actionPerformed ( ActionEvent e )

{

if (MODIFY.equals (e.getActionCommand ()))

{

System.out.println (MODIFY)

fireEditingStopped ()

}

else if (DELETE.equals (e.getActionCommand ()))

{

System.out.println (DELETE)

fireEditingStopped ()

}

}

@Override

public Component getTableCellEditorComponent ( JTable table, Object value, boolean isSelected, int row, int column )

{

if (column == 4)

{

button.setText (MODIFY)

button.setActionCommand (MODIFY)

}

else if (column == 5)

{

button.setText (DELETE)

button.setActionCommand (DELETE)

}

return button

}

}

对你的需求,简单一点,定义一个类,继承DefaultTableCellRenderer,在其中方法getTableCellRendererComponent中直接返回单元格内的按钮即可。

事实上,我们不一定需要将按钮直接放到表格中,放一个需要显示的字符串就可以了,也省去了定义Renderer的功夫。如果需要实现单元格的点击事件,直接写一个TableCellEditor就可以。

你现在的方式,即使能够显示成按钮的样子,也无法点击,还是要写TableCellEditor.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11381722.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存