SQLデータベースがあり、レコードの追加/削除/変更を可能にするプログラムに取り組んでいます。すでに編集/削除に取り組んでいるレコードを追加できました。
テーブルに既存のレコードを表示したいので、jTableを使用しています。オンラインでいくつかのコードを見つけ、レコードをプルしてjtableに表示するように修正しましたが、右クリックをコーディングしてポップアップメニューを表示する方法がわかりません。
そのポップアップメニューで、レコードの削除やレコードの変更などのオプションを表示します。
これは、jTableを作成してデータを表示するために使用しているコードです。
private void menuDeleteAuthorActionPerformed(Java.awt.event.ActionEvent evt) {
TableFromDatabase deleteAuthor = new TableFromDatabase();
deleteAuthor.pack();
deleteAuthor.setVisible(true);
Vector columnNames = new Vector();
Vector data = new Vector();
try
{
Connection connection = DriverManager.getConnection( url, user, password );
// Read data from a table
String sql = "SELECT * FROM Authors";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
// Get column names
for (int i = 1; i <= columns; i++)
{
columnNames.addElement( md.getColumnName(i) );
}
// Get row data
while (rs.next())
{
Vector row = new Vector(columns);
for (int i = 1; i <= columns; i++)
{
row.addElement( rs.getObject(i) );
}
data.addElement( row );
}
rs.close();
stmt.close();
connection.close();
}
catch(Exception e)
{
System.out.println( e );
}
// Create table with database data
JTable table = new JTable(data, columnNames)
{
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
{
return o.getClass();
}
}
return Object.class;
}
};
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
JPanel buttonPanel = new JPanel();
getContentPane().add( buttonPanel, BorderLayout.SOUTH );
}
私はJavaが初めてなので、あなたの応答に親切にしてください。助けてくれてありがとうございます!
これを行う方法の例を次に示します。これを実現する最も簡単な方法は、JTableにJPopupMenu
を直接設定することです。
import Java.awt.BorderLayout;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.util.Arrays;
import Java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
public class TestTableRightClick {
protected void initUI() {
final JFrame frame = new JFrame(TestTableRightClick.class.getSimpleName());
Vector<String> columns = new Vector<String>(Arrays.asList("Name", "Age"));
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 50; i++) {
Vector<String> row = new Vector<String>();
for (int j = 0; j < columns.size(); j++) {
row.add("Cell " + (i + 1) + "," + (j + 1));
}
data.add(row);
}
final JTable table = new JTable(data, columns);
final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem deleteItem = new JMenuItem("Delete");
deleteItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Right-click performed on table and choose DELETE");
}
});
popupMenu.add(deleteItem);
table.setComponentPopupMenu(popupMenu);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTableRightClick().initUI();
}
});
}
}
右クリックが行われた行を自動的に選択する場合は、次のスニペットを追加します。
popupMenu.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table));
if (rowAtPoint > -1) {
table.setRowSelectionInterval(rowAtPoint, rowAtPoint);
}
}
});
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
// TODO Auto-generated method stub
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
// TODO Auto-generated method stub
}
});
JTableの問題は、右クリックしても行の選択が変更されないことです。したがって、特定の行で動作するアクションがある場合は、ポップアップメニューを表示するために右クリックする前に行を左クリックする必要があります。
右クリックした場所で行を選択する場合は、次のようなコードを使用できます。
import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;
public class TableRightClick extends JFrame implements ActionListener
{
JPopupMenu popup;
public TableRightClick()
{
popup = new JPopupMenu();
popup.add( new JMenuItem("Do Something1") );
popup.add( new JMenuItem("Do Something2") );
popup.add( new JMenuItem("Do Something3") );
JMenuItem menuItem = new JMenuItem("ActionPerformed");
menuItem.addActionListener( this );
popup.add( menuItem );
JTable table = new JTable(50, 5);
table.addMouseListener( new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
System.out.println("pressed");
}
public void mouseReleased(MouseEvent e)
{
if (e.isPopupTrigger())
{
JTable source = (JTable)e.getSource();
int row = source.rowAtPoint( e.getPoint() );
int column = source.columnAtPoint( e.getPoint() );
if (! source.isRowSelected(row))
source.changeSelection(row, column, false, false);
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
table.setPreferredScrollableViewportSize(table.getPreferredSize());
getContentPane().add( new JScrollPane(table) );
}
public void actionPerformed(ActionEvent e)
{
Component c = (Component)e.getSource();
JPopupMenu popup = (JPopupMenu)c.getParent();
JTable table = (JTable)popup.getInvoker();
System.out.println(table.getSelectedRow() + " : " + table.getSelectedColumn());
}
public static void main(String[] args)
{
TableRightClick frame = new TableRightClick();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
別の問題は、コンテキストメニューがダイナミクスであるということです。ソリューションでは、クリックされた行に応じてメニューを変更することはできません。
popupMenu.addPopupMenuListener(new PopupMenuListener()
{
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) // juste pour selectionner la row quant on right click, putain de swing de merde
{
int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table));
generateTablePopupMenu(rowAtPoint); <<<<<<<<<<<< here
SwingUtilities.invokeLater(new Runnable()
...