2013-04-17 72 views
5

Tôi đang sử dụng JTable để trực quan hóa một số dữ liệu. Một cột ist mệnh để hiển thị dữ liệu boolean thông qua một hộp kiểm. Tôi đã đạt được điều này bằng cách trả về Boolean.class từ hàm getColumnClass() đã được lược tả của tôi trong mô hình bảng của tôi.JTable - Các sự cố với Trình kết xuất ô Boolean.class và Giao diện và hình ảnh của Nimbus

Thật không may điều này dẫn đến một ô có hộp kiểm nhưng không có màu nền thích hợp cho hàng hiện tại.

Original

tôi cố định này bằng cách sử dụng các câu trả lời từ bài này: JTable - Boolean Cell Type - Background

Boolean.class fix

Bây giờ tôi đang cố gắng để tăng độ tương phản của các hàng xen kẽ. Tôi đã đạt được điều này bằng cách thiết lập các tài sản thích hợp của Nimbus LAF, mà tôi đang sử dụng.

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

With set Nimbus property

Như bạn thấy, nền của các tế bào Boolean vẫn là cũ Nimbus Table.alternateRowColor màu.

Có cách nào để thay đổi điều này không? Tôi làm điều này hoàn toàn sai? Có cách nào tốt hơn để đạt được màu nền xen kẽ và độ tương phản cao hơn không?

EDIT

gây ra trên

phiên bản java "1.7.0_17" Java (TM) SE Runtime Environment (xây dựng 1.7.0_17-b02) Java HotSpot (TM) Server VM (xây dựng 23,7 -b01, chế độ hỗn hợp), hệ điều hành là Ubuntu 12,04

+4

+1 câu hỏi hay, bắt tốt, có thể là câu hỏi rất hay cho người đọc trong tương lai trong trường hợp bạn sẽ đăng [SSCCE] (http://sscce.org/), ngắn, chạy được, có thể biên dịch – mKorbel

Trả lời

5
  • tôi sẽ sử dụng khái niệm Renderer tiêu chuẩn cho công việc này, thay vì chơi với Nimbus hằng

  • Renderer làm việc cho Nimbus, ghi đè lên tất cả các màu sắc, trừ JTableHeader

  • mã dựa trên @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

Lúc đầu điều này trông tuyệt vời. Nhưng tôi không nhận được kết quả tương tự như bạn. Cột Boolean.class của tôi là stil không giống như những người khác. Rất tiếc, tôi không có [SSCCE] (http://sscce.org/) mà tôi có thể đăng ở đây, nhưng tôi đang làm việc trên đó. ** CHỈNH SỬA: ** Rất lạ. Tôi đã sao chép mã của bạn vào một lớp mới và vẫn nhận được [cái nhìn khác] (http://www.abload.de/img/tableweytc.png). – padde

+0

mọi thứ đều bị ẩn trong Trình kết xuất của bạn, có điều gì đó ..., hãy chắc chắn rằng bạn sẽ đặt Boolean (đúng/sai) vào JTable không phải JCheckBox, cũng không có gì đó về JCheckBox, sau đó bạn sẽ gặp may, bắt buộc phải ghi đè tất cả khóa cho JCheckBox trong UIManager – mKorbel

+0

Như tôi đã nói trong chỉnh sửa của mình: ngay cả với mã của bạn, tôi cũng nhận được kết quả khác. Khá lạ .. – padde

6

tôi (cuối cùng) có thể nhận được nó hoạt động. Bí quyết là thay đổi mặc định TRƯỚC KHI bạn tạo ra bất cứ thứ gì.

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

Cảm ơn, có vẻ tốt. Rất tiếc, tôi đang làm việc với Nền tảng Netbeans tại đây, vì vậy "trước khi bạn thay đổi bất kỳ điều gì" có thể khó xác định. Tôi hiện đang cố gắng sử dụng một Trình cài đặt mô-đun để thực hiện việc này lúc khởi động và xem cách thức hoạt động. Tôi cũng đang cố gắng trả lời @mKorbel kể từ khi LAF độc lập. – padde

+0

Giải pháp tốt. Tôi thừa nhận rằng tốt hơn là thay đổi giao diện ở cấp độ L & F, thay vì viết mã cứng như các câu trả lời khác được đề xuất. –

+0

@AdamDyga Tôi thấy rất nhiều người nhảy thẳng và cập nhật 'JTable' vì nhiều lý do, tôi có vấn đề cá nhân với điều này, vì nó kết hợp chặt chẽ giải pháp với phần mở rộng. Nếu bạn có thể tìm cách để cho phép để giữ mã di động, sau đó nó đã có giá trị nỗ lực, IMHO – MadProgrammer

0

để giải quyết vấn đề này tôi đã sử dụng jxtable() thay JTable() và tôi đã sử dụng prepareRenderer riêng cho màu sắc hàng (bạn có thể sử dụng mKorbel ai, đưa nó vào bảng trong netbeans chỉ Tùy chỉnh mã cho thành phần jxtable()), bởi vì giải pháp này: JTable - Boolean Cell Type - Background không hoạt động với nhiều hàng màu cho tôi. Nền tảng của tôi: Windows 7 32 bit, phiên bản java "1.7.0_21", Môi trường chạy thử Java (TM) SE (xây dựng 1.7.0_21-b11), Máy khách Java HotSpot (TM) (xây dựng 23,21-b01, chế độ hỗn hợp, chia sẻ), netbeans IDE 7.3

Đây là png (không có đủ danh tiếng: D): jxtable().

0

Ngay sau khi cài đặt Nimbus L & F, thêm dòng này:

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()); 

Lưu ý sử dụng ColorUIResource cho Table.background. Điều này đã khắc phục vấn đề nền hộp kiểm cho tôi.