【问题标题】:Display JTable in JPanel在 JPanel 中显示 JTable
【发布时间】:2014-10-15 13:01:21
【问题描述】:

我一直在尝试将 JTable 添加到我的 JPanel,但它没有出现在那里。我搜索了其他问题,但那里提出的解决方案对我没有帮助。

下面的函数是扩展 JFrame 的类的一部分。 “repaint”是 BufferedImage,“imageLabel”是 JLabel,“image”是 ImageIcon。

public void showTable() {
    try {
        repaint = ImageIO.read(new File("filename.jpg"));
    } catch (IOException e) { }

    Graphics g = repaint.createGraphics();
    g.setFont(font);
    g.setColor(black);
    String[] columnsName = {"id","text"};
    Object[][] data = {{new Integer(1),"text one"},{new Integer(2),"text two"}};
    JTable table = new JTable(data, columnsName);
    JScrollPane tableContainer = new JScrollPane(table);
    image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH));
    imageLabel.setIcon(image);
    imageLabel.add(tableContainer,BorderLayout.CENTER);
    getContentPane().add(imageLabel);

    pack();
    setVisible(true);
    repaint();
    revalidate();
}

我想要实现的是在加载的图像上显示表格。

提前感谢您的帮助:)

【问题讨论】:

  • 您是否为imageLabel 设置了布局管理器? JLabel 默认为空布局。如果我们想向它添加组件,我们需要设置它
  • 你为什么要把所有东西都放在JLabel中?
  • 你做错了很多事情——没有使用布局管理器,如果容器还没有使用 BorderLayout,则期望 BorderLayout.CENTER 常量工作,通过 getGraphics() 获取你的 Graphics 对象。 . 是时候开始阅读教程了,因为它每次都比猜测要好。

标签: java swing jtable jpanel jlabel


【解决方案1】:
  1. 为您的 JLabel 提供一个布局管理器,此处为 BorderLayout,通过 setLayout(new BorderLayout())
  2. 不要通过getGraphics() 获取您的Graphics 对象,因为它返回的对象是短暂的。要亲自查看,请最小化您的程序,然后将其恢复并观看您的绘图消失。相反,请在 paintComponent(...) 覆盖方法中进行绘制。
  3. 阅读 Swing 教程以获取有关如何执行这些操作的更多详细信息,尤其是布局管理器教程。

【讨论】:

  • 挠头。您的答案与接受的答案完全不同。您的回答假设 OP 希望标签成为背景,这就是我的假设(代码类型暗示了这一点)。公认的答案暗示了一些完全不同的东西。谁知道:/
【解决方案2】:

我不确定我是否理解正确,但您想在其下方放置一张表格和一张图片,对吗? 我会创建一个带有 BorderLayout 的 JPanel,将图像 (JLabel) 放在底部(页尾),将表格(您创建的 scrollPanel)放在中心。 如果您在使用 BorderLayout 向 JPanel 添加项目时需要帮助,请参阅本教程中的操作方法: http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

希望对你有帮助。

【讨论】:

    【解决方案3】:

    感谢到目前为止的所有提示 :) 它们真的很有用。我知道我可能会以一种不优雅的方式做一些事情,但我仍在学习,会努力改进:)

    给定的提示和更多搜索将我引向这样的代码:

        public void showTable()
        {
        try
        {
            repaint = ImageIO.read(new File("filename.jpg"));
        }catch (IOException e) {
        }
        Graphics g = repaint.createGraphics();
        g.setFont(font);
        g.setColor(black);
        String[] columnsName = {"id","text"};
        Object[][] data = {{new Integer(1),"text one"},{new Integer(2),"text two"}};
        JTable table = new JTable(data, columnsName);
        table.setOpaque(false);
        JScrollPane tableContainer = new JScrollPane(table);
        tableContainer.setBorder(BorderFactory.createEmptyBorder());
        tableContainer.setOpaque(false);
        tableContainer.getViewport().setOpaque(false);
        image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH));
        imageLabel.setIcon(image);
        imageLabel.setLayout(new BorderLayout());
        imageLabel.add(tableContainer, BorderLayout.SOUTH);
        repaint();
        revalidate();
        }
    

    这对我来说很好:)

    再次感谢大家的帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多