Пресичащи JLabels вътре в JTable

В изображението по-долу се опитвам да постигна следното. Имам таблица и много етикети, релефни върху клетките на таблицата. Височината на етикетите винаги е равна на височината на клетката. Така че, ако два етикета са в една и съща точка, единият скрива друг, както е показано в по-дългите правоъгълници с червен правоъгълник върху синьо. Като алтернатива това, което искам, е да направя височината като половина и там да покажа и двата правоъгълника (показвайки началната и крайната точка на правоъгълника, тъй като височината не е от полза, мога да наполовина височина на правоъгълника, за да побере още един в същата клетка.)

Трябва да направя това вътре в JTable. За да прикрепим етикет, можем да създадем обект JLabel, като зададем правоъгълните граници и използваме table.add(label);

изображение тук


person Harish    schedule 17.07.2010    source източник


Отговори (3)


Откъде взе идеята, че можеш да направиш table.add(label) и да се надяваш етикетът да бъде магически нарисуван върху масата?

(Същото ??? за отговора на @dpatch.)

Трябва да използвате средство за изобразяване/редактиране на клетки за всяко персонализирано рисуване вътре в таблицата. (Или многослоен панел/стъклен панел, ако е нещо плаващо над таблицата, но изглежда, че искате етикетите в клетките.)

Груб рендър, който рисува клетка (0, 0) като синьо на половин височина върху червено на пълна височина:

table.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer()
{
    private int row_ = 0;

    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {
        row_ = row;
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }

    public void setUI(LabelUI ui)
    {
        super.setUI(new BasicLabelUI()
        {
            public void paint(Graphics g, JComponent c)
            {
                super.paint(g, c);
                if( row_ == 0 )
                {
                    Rectangle r = g.getClipBounds();
                    g.setColor(Color.RED);
                    g.fillRect(r.x, r.y, r.width, r.height);
                    g.setColor(Color.BLUE);
                    g.fillRect(r.x, r.y + 1, r.width, r.height/2 - 1);
                }
            }
        });
    }
});
person Geoffrey Zheng    schedule 03.09.2010
comment
Работи. Можете да опитате, като зададете label.setOpaque(true) и label.setVisible(true); - person Harish; 07.09.2010
comment
Ако работи, ще съм благодарен, ако приемете отговора. Благодаря! - person Geoffrey Zheng; 07.09.2010

Вижте следната презентация. Мисля, че говори за решение на подобен проблем

http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-4982.pdf?cid=925395

person Eugene Ryzhikov    schedule 17.07.2010
comment
Не съм сигурен, че мога да го направя по друг начин. - person Eugene Ryzhikov; 18.07.2010

Когато намерите два етикета, които трябва да бъдат в една и съща клетка, създайте JPanel, като всеки от червените и сините етикети заема половината от височината на панела. След това просто добавете панела към масата.

person dpatchery    schedule 21.07.2010