2013-04-17 3 views
5

Ich verwende eine JTable, um einige Daten zu visualisieren. Eine Spalte soll boolesche Daten über ein Kontrollkästchen anzeigen. Dies habe ich erreicht, indem ich Boolean.class von meiner überschriebenen Funktion getColumnClass() in meinem Tabellenmodell zurückgegeben habe.JTable - Probleme mit Boolean.class Cell Renderer und Nimbus Look and Feel

Leider ergibt dies eine Zelle mit einem Kontrollkästchen, aber ohne eine Hintergrundfarbe für die aktuelle Zeile.

Original

Ich reparierte diese durch die Antwort von diesem Posten mit: JTable - Boolean Cell Type - Background

Boolean.class fix

Jetzt habe ich versucht, den Kontrast der abwechselnden Reihen zu erhöhen. Ich habe dies erreicht, indem ich die entsprechende Eigenschaft des Nimbus LAF eingestellt habe, den ich verwende.

UIDefaults defaults = UIManager.getLookAndFeelDefaults(); 
defaults.put("Table.alternateRowColor", new Color(217, 217, 217)); 

With set Nimbus property

Wie Sie sehen, ist der Hintergrund der Booleschen Zellen noch die alte Nimbus Table.alternateRowColor Farbe.

Gibt es eine Möglichkeit, dies zu ändern? Mache ich das völlig falsch? Gibt es einen besseren Weg, um eine wechselnde Hintergrundfarbe und mehr Kontrast zu erzielen?

EDIT

verursacht auf

java version "1.7.0_17" Java (TM) SE Runtime Environment ( 1.7.0_17-b02 build) Java HotSpot (TM) Server VM (Build 23.7 -b01, mixed mode), O ist Ubuntu 12,04

+4

+1 nette Frage, guter Fang, könnte sehr gute Frage für zukünftige Leser in dem Fall sein, dass Sie eine [SSCCE] (http://sscce.org/), kurz, runnable, kompilierbar – mKorbel

Antwort

5
  • ich würde Standard Renderer Konzept für diesen Job zu verwenden, anstatt mit Nimbus Konstanten spielt

  • Renderer für Nimbus funktioniert, haben Vorrang vor allen Farben, außer JTableHeader

  • Code basierend auf @camickrs Table Row Rendering

enter image description here

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

public class TableRowRenderingTip extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public TableRowRenderingTip() { 
     Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"}; 
     Object[][] data = { 
      {"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE}, 
      {"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE}, 
      {"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE}, 
      {"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE}, 
      {"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames) { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public Class getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.addTab("Alternating", createAlternating(model)); 
     add(tabbedPane); 
    } 

    private JComponent createAlternating(DefaultTableModel model) { 
     JTable table = new JTable(model) { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       if (!isRowSelected(row)) { // Alternate row color 
        c.setBackground(row % 2 == 0 ? getBackground() : Color.orange); 
       } 
       return c; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     ((JComponent) table.getDefaultRenderer(Boolean.class)).setOpaque(true); 
     return new JScrollPane(table); 
    } 

    public static void main(String[] args) { 
     try { 
      for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (Exception e) { 
      return; 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame.setDefaultLookAndFeelDecorated(false); 
     JFrame frame = new JFrame("Table Row Rendering"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableRowRenderingTip()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

zuerst veröffentlichen Das sah fantastisch aus. Aber ich bekomme nicht die gleichen Ergebnisse wie du. Meine Boolean.class-Spalte sieht immer noch nicht wie die anderen aus. Leider habe ich keine [SSCCE] (http://sscce.org/), die ich hier posten kann, aber ich arbeite daran. ** EDIT: ** Sehr seltsam. Ich habe deinen Code in eine neue Klasse kopiert und erhalte immer noch einen anderen [look] (http://www.abload.de/img/tableweytc.png). – padde

+0

alles ist in Ihrem Renderer versteckt, es gibt etwas ..., stellen Sie sicher, dass Sie Boolean (wahr/falsch) zu JTable nicht JCheckBox setzen, noch gibt es nichts über JCheckBox, dann haben Sie kein Glück, benötigt, um alle Schlüssel für JCheckBox in UIManager zu überschreiben – mKorbel

+0

Wie ich in meinem Edit sagte: sogar mit Ihrem Code bekomme ich ein anderes Ergebnis. Ziemlich seltsam .. – padde

6

war ich (endlich) in der Lage zu bekommen es funktioniert. Das Geheimnis war, die Standardwerte zu ändern, bevor Sie etwas erstellen.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JCheckBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 
import javax.swing.plaf.UIResource; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 

public class TestTable10 { 

    public static void main(String[] args) { 
     new TestTable10(); 
    } 

    public TestTable10() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       UIManager.getLookAndFeelDefaults().put("Table.alternateRowColor", Color.RED); 

       JTable table = new JTable(new MyModel()); 
       ((JComponent) table.getDefaultRenderer(Boolean.class)).setOpaque(true); 


       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MyModel extends AbstractTableModel { 

     @Override 
     public int getRowCount() { 
      return 10; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      switch (columnIndex) { 
       case 0: 
        return "Hello"; 
       case 1: 
        return true; 
      } 
      return "?"; 
     } 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      return columnIndex == 0 ? String.class : Boolean.class; 
     } 
    } 

} 
+0

Danke, sieht gut aus. Leider arbeite ich hier mit der Netbeans-Plattform, also "bevor du etwas änderst" könnte schwer zu bestimmen sein. Ich versuche derzeit, einen Modul-Installer zu verwenden, um dies beim Start zu tun und zu sehen, wie es geht. Ich versuche auch @mKorbel Antwort seit seiner LAF unabhängig. – padde

+0

Schöne Lösung. Ich gebe zu, dass es besser ist, den Blick auf das L & F-Niveau zu ändern, anstatt es wie andere Antworten zu kodifizieren. –

+0

@AdamDyga Ich sehe eine Menge Leute, die geradeaus springen und die 'JTable' aus vielen Gründen aktualisieren, ich habe ein persönliches Problem damit, da es die Lösung eng mit der Erweiterung verbindet. Wenn Sie Wege finden können, den Code portabel zu halten, dann ist es die Mühe wert, IMHO – MadProgrammer

0

dieses Problem, das ich jxtable verwendet zu lösen() statt jtable() und ich eigene prepareRenderer für Zeilenfarben (Sie verwenden können mKorbel die ein, es in Netbeans zu Tisch legen einfach Passen Sie den Code für die Komponente jxtable() an, denn diese Lösung: JTable - Boolean Cell Type - Background funktioniert bei mehreren Farbreihen für mich nicht. Meine Plattform: Windows 7 32bit, Java Version "1.7.0_21", Java (TM) SE Laufzeitumgebung (Build 1.7.0_21-b11), Java HotSpot (TM) Client VM (Build 23.21-b01, mixed mode, sharing), IDE Netbeans 7.3

Hier ist png (nicht genug Ruf haben: D): jxtable().

0

Unmittelbar Nimbus L & F nach der Einstellung, fügen Sie diese Zeilen:

UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.DARK_GRAY); 
    UIManager.getLookAndFeelDefaults().put("Table.background",new ColorUIResource(Color.DARK_GRAY)); 
    UIManager.getLookAndFeelDefaults().put("Table.alternateRowColor",Color.DARK_GRAY.brighter()); 

Hinweis Verwendung von ColorUIResource für Table.background. Dies hat das Kontrollkästchen Hintergrundproblem für mich behoben.

Verwandte Themen