ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
719
719
EMPFEHLEN
-
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
-
[Swing][L&F] Frage zu JButton.setBackground()
Von vfl_freak im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 10.05.11, 08:40 -
SWING : JCheckbox auswerten + JButton
Von nighty86 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 06.11.10, 17:30 -
JTable Zelle editieren sodass ein Event im Listener ausgelöst wird
Von BKochs im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 13.07.09, 09:54 -
Swing JButton setSize?
Von BaseBallBatBoy im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 5Letzter Beitrag: 05.06.08, 22:52 -
JTable ComboBox in Zelle soll andere Zelle beeinflussen
Von Moltar im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 04.06.07, 15:09





Zitieren
Login





