JButton не отвечает на события нажатия - PullRequest
2 голосов
/ 27 марта 2012

Приложение, над которым я работаю, требует использования JList, где каждый ListItem является меткой, за которой следует кнопка.

Я создал класс с элементом String для текстового поля и добавил объекты класса в Jlist.

Теперь для кнопки я реализовал пользовательский рендерер ячеек списка, который выглядит так:

    public renderer()
{
    text=new JLabel();
    button=new JButton("Track");
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            System.out.println("Hey");

        }
});
}

public Component getListCellRendererComponent(JList list, Object value, int index,boolean isSelected, boolean cellHasFocus)
{
    it=(item)list.getModel().getElementAt(index);
    text.setText(it.tex);
    return this;
}

public void paintComponent(Graphics g)
{
    this.add(text);
    this.add(button);
    this.setVisible(true);
}

public Dimension getpreferredSize(){
    Font font=UIManager.getDefaults().getFont("JLabel.Font");
    Graphics g=getGraphics();
    FontMetrics fm=g.getFontMetrics(font);
    return new Dimension(fm.stringWidth(it.tex)+button.getWidth(),fm.getHeight()>button.getWidth()?fm.getHeight():button.getWidth());
}
}

Но кнопка не реагирует, когда я нажимаю на нее. Что я пропустил?

Спасибо

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Зачем так много проблем с JList, средствами визуализации и редакторами, когда вы можете просто создать JPanel с разметкой блока, поместить все метки и кнопки внутри, а затем отобразить эту панель на панели прокрутки.Код будет коротким, и с поведением проблем не будет.

Вообще говоря, размещение других компонентов - это такие компоненты, как JTable и JList, почти всегда больше проблем, чем стоит.

1 голос
/ 27 марта 2012
  • Renderer только для отображения и форматирования JComponets внутри JList, JComboBox или JTable, в основном все описано в JList и JTable руководствах, затем с помощью JList вы может ты можешь только

enter image description hereenter image description hereenter image description here

  • может быть, я ошибаюсь, но я думаю, что ничто иное, из JList вы не можете вернуть JButtons нажата или другая JButton's events, только выбором в JList, конечно, этим событием Вы можете генерировать ожидающее событие в GUI, но только из выбора JList, а не из JButton

код

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

public class ListPanel extends JFrame {

    private static final long serialVersionUID = 1L;

    public ListPanel() {
        DefaultListModel model = new DefaultListModel();
        model.addElement(createPanel("one"));
        model.addElement(createPanel("two"));
        model.addElement(createPanel("three"));
        model.addElement(createPanel("four"));
        JList list = new JList(model);
        list.setCellRenderer(new PanelRenderer());
        add(list);
    }

    public static JButton createPanel(String text) {
        JButton panel = new JButton(text);
        return panel;
    }

    public static void main(String[] args) {
        ListPanel frame = new ListPanel();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    class PanelRenderer implements ListCellRenderer {

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JButton renderer = (JButton) value;
            renderer.setBackground(isSelected ? Color.red : list.getBackground());
            return renderer;
        }
    }
}
  • у вас есть собственные инструменты Editor, никогда не пробовал в JList, потому что есть пропущенные важные методы по сравнению с JTable,

  • заменить JList на JTable, создать JTable без TableHeader и только с одним Column

  • следует только !!! с кодом @ camickr ,

.

.

РЕДАКТИРОВАТЬ (@Jakub Zaverka)

.

.

enter image description here

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

public class ListPanel extends JFrame {

    private static final long serialVersionUID = 1L;

    public ListPanel() {
        setLayout(new GridLayout(0, 2, 10, 10));
        DefaultListModel model = new DefaultListModel();
        model.addElement(createButtons("one"));
        model.addElement(createButtons("two"));
        model.addElement(createButtons("three"));
        model.addElement(createButtons("four"));
        model.addElement(createButtons("five"));
        model.addElement(createButtons("six"));
        model.addElement(createButtons("seven"));
        model.addElement(createButtons("eight"));
        model.addElement(createButtons("nine"));
        model.addElement(createButtons("ten"));
        model.addElement(createButtons("eleven"));
        model.addElement(createButtons("twelwe"));
        JList list = new JList(model);
        list.setCellRenderer(new PanelRenderer());
        add(new JScrollPane(list));
        add(new JScrollPane(createPanel()));
    }

    public static JPanel createPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, 1, 1, 1));
        panel.add(createButtons("one"));
        panel.add(createButtons("two"));
        panel.add(createButtons("three"));
        panel.add(createButtons("four"));
        panel.add(createButtons("five"));
        panel.add(createButtons("six"));
        panel.add(createButtons("seven"));
        panel.add(createButtons("eight"));
        panel.add(createButtons("nine"));
        panel.add(createButtons("ten"));
        panel.add(createButtons("eleven"));
        panel.add(createButtons("twelwe"));
        return panel;
    }

    public static JButton createButtons(String text) {
        JButton button = new JButton(text);
        return button;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ListPanel frame = new ListPanel();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                //frame.pack();
                frame.setSize(270, 200);
                frame.setVisible(true);
            }
        });
    }

    class PanelRenderer implements ListCellRenderer {

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JButton renderer = (JButton) value;
            renderer.setBackground(isSelected ? Color.red : list.getBackground());
            return renderer;
        }
    }
}
1 голос
/ 27 марта 2012

Вы также должны создать собственный редактор ячеек списка, который повторно использует код из ListCellRenderer для образов, но реализует прослушиватель действий для кнопки.Средства визуализации ячеек используются только для печати графических изображений в списке.Для использования элементов управления в JList вы должны использовать редакторы ячеек.

0 голосов
/ 27 марта 2012

@ Jakub Zaverka Я согласен, я уже использую это, и он отлично работает.@nikel Я рекомендую вам использовать GridBagLayout и GridBagConstraint для управления вашим компонентом.

...