java - 将 Ellipse2D 与 JTable 单元格关联

标签 java swing

目前我已经编写了一些代码,当用户单击 Ellipse2D 时,它会选择 JTable 中的单元格。如果用户单击 JTable 中的关联单元格,我还想填充 Ellipse2D。使用下面的代码,我将如何做到这一点?

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

public class SelfContainedExample extends JPanel implements MouseListener {

    private Map<Ellipse2D.Double, Point> shapesMap = new HashMap<>();
    private Ellipse2D.Double[] ellipses = new Ellipse2D.Double[] {
                                          new Ellipse2D.Double(50, 100, 30, 30),
                                          new Ellipse2D.Double(175, 100, 30, 30),
                                          new Ellipse2D.Double(300, 100, 30, 30),
                                          new Ellipse2D.Double(50, 160, 30, 30),
                                          new Ellipse2D.Double(175, 160, 30, 30),
                                          new Ellipse2D.Double(300, 160, 30, 30)};

    static Object[][] data = {{"1_1", "1_2", "1_3"},
                              {"2_1", "2_2", "2_3"},
                              {"3_1", "2_2", "2_3"},
                              {"4_1", "2_2", "2_3"},
                              {"5_1", "2_2", "2_3"},
                              {"6_1", "2_2", "2_3"}};

    static Object[] columnNames = {"1", "2", "3"};
    static JTable jtable = new JTable(data, columnNames);

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> createAndShowGUI());
    }

    public SelfContainedExample() {

        int row = 0;
        int column = 0;

        for (Ellipse2D.Double ellipse : ellipses) {

            shapesMap.put(ellipse, new Point(row, column));
            row++;
        }

        addMouseListener(this);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g.create();
        g2d.setColor(Color.BLACK);

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setStroke(new BasicStroke(3));
        g2d.setColor(Color.GRAY);
        for (Ellipse2D ellipse : ellipses) {
            g2d.draw(ellipse);
        }

        g2d.dispose();
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Example");
        JPanel panel = new JPanel();
        JPanel tablePanel = new JPanel();
        JScrollPane jScrollPane = new JScrollPane(jtable);

        jScrollPane.setPreferredSize(new Dimension(385, 119));

        tablePanel.add(jScrollPane);
        tablePanel.setSize(200, 200);

        panel.setLayout(new BorderLayout());
        panel.add(new SelfContainedExample(), BorderLayout.CENTER);
        panel.add(tablePanel, BorderLayout.SOUTH);
        panel.setOpaque(true);
        panel.setVisible(true);

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLocationByPlatform(false);
        frame.setLocationRelativeTo(null);
        frame.setContentPane(panel);
        frame.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {
        for (Ellipse2D.Double ellipse : ellipses) {
            if (ellipse.contains(e.getPoint())) {
                jtable.requestFocusInWindow();
                Point p = shapesMap.get(ellipse);
                jtable.editCellAt(p.x, p.y);
            }

            if (jtable.contains(e.getPoint())) {

            }
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}
}

最佳答案

建议:

  • 创建 Ellipse2D 变量 selectedEllipse,将 == 设置为 null。
  • 在您的paintComponent中,如果selectedEllipse不为null,则填充它。
  • 监听 JTable 的选择事件,这可能在您的 MouseListener 中,您可以在其中获取选定的行和列,然后使用此信息来设置 selectedEllipse。您可以使用映射将表格单元格与椭圆关联起来,或者更好的是,使用选定的表格行和列索引。

关于java - 将 Ellipse2D 与 JTable 单元格关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723261/

相关文章:

java - 需要帮助来消除我的 Java 图形代码中的异常

java - 如何解决不必要的 stub 异常

Java Swing : cannot set JTextArea text in JDialog after it opens

java - CardLayout - 定位组件

java - 在单独的窗口中打开一个新的 jframe 以搜索信息的 clickbutton 事件

java - 当x和y位置进入另一个位置时如何执行操作?

java - Spliterator并行排序顺序

java - 在 kotlin 中使用接口(interface)时获取平台声明冲突

c# - 保持库无依赖性

带有 Jersey 和 Tomcat 的 Java Web 服务。 ¿如何在 Web 服务停止时停止所有线程?