将JPanel放入JTable单元格

时间:2019-05-30 18:59:39

标签: java swing jtable

这就是我要创建的:

https://ibb.co/BfpQG0G

我试图使用JTable使用gui创建一个属性编辑器,其想法是将bean的每个属性放在行中,其中第一列将代表其名称,第二列将显示其值。问题出在属性具有可以表示其值的特定gui组件时,我想在表中显示它,但我不知道如何。 PropertyEditor具有方法getCustomEditor(),该方法返回我需要在表中显示的Component。如果我试图仅在JPanel中显示它,则效果很好,但是当我试图将其放置在表的单元格上时,它却没有效果。

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyEditorManager;

class MyPanel extends JPanel {
    public MyPanel() {
        this.setLayout(new BorderLayout());
        this.add(PropertyEditorManager.findEditor(Color.class).getCustomEditor());
    }
}
public class runner {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new MyPanel());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocation(500,500);
        frame.setSize(500,500);
    }
}

此代码将在面板上为我提供以下组件: https://ibb.co/8Y7p93F

但是,如果我尝试将其放入表格单元格中,它将无法正常工作

import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;

class MyPanel extends JPanel {
    public MyPanel() {
        this.setLayout(new BorderLayout());
        this.add(PropertyEditorManager.findEditor(Color.class).getCustomEditor());
    }
}

public class TableRendererPanel extends JFrame
{
    public static void main(String[] args)
    {
        TableRendererPanel frame = new TableRendererPanel();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public TableRendererPanel()
    {
        JTable table = new JTable(5, 3);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
        table.setValueAt(new Object(), 1, 0);
        table.setDefaultRenderer(Object.class, new MultiLabelRenderer());
    }

    class MultiLabelRenderer implements TableCellRenderer
    {
        private MyPanel myPanel;

        public MultiLabelRenderer()
        {
            myPanel = new MyPanel();
        }

        public Component getTableCellRendererComponent(
                JTable table, Object value, boolean isSelected,
                boolean hasFocus, final int row, final int column)
        {
            return myPanel;
        }
    }

}

这是代码的结果 https://ibb.co/4szhmQH

这是我的问题:

1)如何将JPanel放置并呈现到表格单元格中?

2)您知道其他选择吗?例如,在此任务中,我正在考虑GridLayout,但是有了它,我就无法控制行高及其重要性。我知道,我可以使用GridBagLayout来实现我的任务,但是我也知道,这将花费很多时间,等等,这通常是个坏主意。

谢谢

0 个答案:

没有答案