tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
719
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    pcworld pcworld ist offline Rookie
    Registriert seit
    May 2009
    Beiträge
    7
    Hallo,

    ich stehe momentan vor dem Problem, dass ich einen interaktiven JButton in eine Zelle einer JTable bauen will. Im Internet findet man auch einiges an Code, allerdings habe ich noch keinen gefunden, der meine Wünsche ganz erfüllt.
    Ich will, dass er sich vom Look&Feel nicht unterscheidet von Buttons in richtigen Containern. Sprich er soll seine Animationen beim Herüberfahren, Anklicken, Loslassen der Maustaste usw. beibehalten.
    Dabei bin ich im Internet auf diesen Code gestoßen, dieser benutzt die Event-Weiterleitung. Die Methode mit dem TableCellRenderer finde ich nicht wirklich praktisch. Diesen habe ich etwas umgebaut und sieht jetzt so aus:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.*;
    import javax.swing.table.*;
     
    class JTableButtonRenderer implements TableCellRenderer {
        private TableCellRenderer defaultRenderer;
     
        public JTableButtonRenderer(TableCellRenderer renderer) {
            defaultRenderer = renderer;
        }
     
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Component)
                return (Component) value;
            return defaultRenderer.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
        }
    }
     
    class JTableButtonModel extends AbstractTableModel {
     
        JButton buttonOne = new JButton("Button One");
        private Object[][] rows = { { "One", buttonOne },
                { "Two", new JButton("Button Two") },
                { "Three", new JButton("Button Three") },
                { "Four", new JButton("Button Four") } };
     
        public JTableButtonModel() {
            buttonOne.addActionListener(new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    System.out.println("button clicked");
                }
            });
        }
     
        private String[] columns = { "Numbers", "Buttons" };
     
        public String getColumnName(int column) {
            return columns[column];
        }
     
        public int getRowCount() {
            return rows.length;
        }
     
        public int getColumnCount() {
            return columns.length;
        }
     
        public Object getValueAt(int row, int column) {
            return rows[row][column];
        }
     
        public boolean isCellEditable(int row, int column) {
            return false;
        }
     
        public Class<?> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    }
     
    class JTableButtonMouseListener implements MouseListener, MouseMotionListener {
     
        private JTable table;
     
        private void forwardEventToButton(MouseEvent e) {
            int row = table.rowAtPoint(e.getPoint());
            int column = table.columnAtPoint(e.getPoint());
     
            Object value;
            JButton button;
            MouseEvent buttonEvent;
     
            if (row >= table.getRowCount() || row < 0
                    || column >= table.getColumnCount() || column < 0)
                return;
     
            value = table.getValueAt(row, column);
     
            if (!(value instanceof JButton))
                return;
     
            button = (JButton) value;
     
            buttonEvent = (MouseEvent) SwingUtilities.convertMouseEvent(table, e,
                    button);
            button.dispatchEvent(buttonEvent);
            // This is necessary so that when a button is pressed and released
            // it gets rendered properly. Otherwise, the button may still appear
            // pressed down when it has been released.
            table.repaint();
        }
     
        private JButton oldEntered = null;
     
        public JTableButtonMouseListener(JTable table) {
            this.table = table;
        }
     
        public void mouseClicked(MouseEvent e) {
            forwardEventToButton(e);
        }
     
        public void mouseEntered(MouseEvent e) {
            // forwardEventToButton(e);
        }
     
        public void mouseExited(MouseEvent e) {
            // forwardEventToButton(e);
        }
     
        public void mousePressed(MouseEvent e) {
            forwardEventToButton(e);
        }
     
        public void mouseReleased(MouseEvent e) {
            forwardEventToButton(e);
        }
     
        @Override
        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub
        }
     
        @Override
        public void mouseMoved(MouseEvent e) {
            MouseEvent enteredEvent = new MouseEvent(e.getComponent(),
                    MouseEvent.MOUSE_ENTERED, e.getWhen(), e.getModifiers(), e
                            .getX(), e.getY(), e.getClickCount(), e
                            .isPopupTrigger(), e.getButton());
            forwardEventToButton(enteredEvent);
        }
    }
     
    public final class JTableButton extends JFrame {
        private JTable table;
        private JScrollPane scrollPane;
     
        public JTableButton() {
            super("JTableButton Demo");
            TableCellRenderer defaultRenderer;
     
            table = new JTable(new JTableButtonModel());
            defaultRenderer = table.getDefaultRenderer(JButton.class);
            table.setDefaultRenderer(JButton.class, new JTableButtonRenderer(
                    defaultRenderer));
            table.setPreferredScrollableViewportSize(new Dimension(400, 200));
            JTableButtonMouseListener listener = new JTableButtonMouseListener(
                    table);
            table.addMouseListener(listener);
            table.addMouseMotionListener(listener);
     
            scrollPane = new JScrollPane(table);
            setContentPane(scrollPane);
        }
     
        public static void main(String[] args) throws Exception {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     
            JFrame frame;
            frame = new JTableButton();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    }

    Ich habe auch einen MouseMotion-Listener eingebaut, mit dem ich es auch hingebracht habe, ein mouseMoved-Event in ein MouseEvent.MOUSE_ENTERED-Event zu verwandeln. D. h., es wird eine Animation angezeigt, wenn ich mit der Maus über die Buttons fahre. Allerdings habe ich da das Probleme, dass wenn ich die JTable verlasse, der zuletzt "berührte" Button noch verfärbt ist, da er kein MouseEvent.MOUSE_EXITED-Event erhält. Auch da habe ich schon rumprobiert und habe versucht, den zuletzt berührten Button abzuspeichern und dann gegebenfalls ein MOUSE_RELEASED-Event zu senden, ganz geklappt hat das allerdings nicht.
    Auch besteht das Problem, dass der Button auf Klicks nicht reagiert - warum, weiß ich noch nicht.

    Wäre nett, wenn mir jemand helfen könnte - vielen Dank für die Antworten schon einmal im Voraus!
    Geändert von pcworld (05.11.10 um 13:20 Uhr)
     

Ähnliche Themen

  1. [Swing][L&F] Frage zu JButton.setBackground()
    Von vfl_freak im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 10.05.11, 08:40
  2. SWING : JCheckbox auswerten + JButton
    Von nighty86 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 06.11.10, 17:30
  3. JTable Zelle editieren sodass ein Event im Listener ausgelöst wird
    Von BKochs im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 13.07.09, 09:54
  4. Swing JButton setSize?
    Von BaseBallBatBoy im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 05.06.08, 22:52
  5. JTable ComboBox in Zelle soll andere Zelle beeinflussen
    Von Moltar im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 04.06.07, 15:09