2015-07-19 79 views
1

如何根據其值增量填充JTable單元格。完全像一個進度條會做的。JTable增量單元格填充

注意: 我不想使用JProgress酒吧! 我想知道是否有辦法做到這一點直接在單元格中畫渲染

+0

有很多方法可以做到這一點。細胞的價值需要是標記,其餘的是微不足道的塗料代碼 – MadProgrammer

+0

我知道已經有很多我認爲......問題是我需要知道「微不足道的塗料代碼」,以及它放在哪裏。 @override油漆?對不起,我對Java和JTable真的很陌生。所以一個簡單的例子會變得簡單。 – KyleK

+0

那麼,渲染一個單元格的責任歸結爲'TableCellRenderer',因此推測這將是一個開始的地方;) – MadProgrammer

回答

1

因此,對於電池的渲染責任歸結到TableCellRenderer,看看Using Custom RenderersConcepts: Editors and RenderersHow to Use Tables瞭解更多詳情

其餘歸結爲簡單的風俗畫,看看Painting in AWT and SwingPerforming Custom Painting2D Graphics更多細節

Progress

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      DefaultTableModel model = new DefaultTableModel(1, 1); 
      model.setValueAt(0, 0, 0); 
      JTable table = new JTable(model); 
      table.getColumnModel().getColumn(0).setCellRenderer(new ProgressTableCellRenderer()); 
      add(new JScrollPane(table)); 

      Timer timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Integer value = (Integer)table.getValueAt(0, 0); 
        value++; 
        if (value > 100) { 
         value = 100; 
         ((Timer)e.getSource()).stop(); 
        } 
        System.out.println(value); 
        table.setValueAt(value, 0, 0); 
       } 
      }); 
      timer.start(); 
     } 

    } 

    public class ProgressTableCellRenderer extends JPanel implements TableCellRenderer { 

     private int progressValue; 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      if (value instanceof Integer) { 
       progressValue = (Integer)value; 
      } 
      return this; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(UIManager.getColor("List.selectionBackground")); 
      int x = (int) (getWidth() * (progressValue/100d)); 
      g2d.fillRect(0, 0, x, getHeight()); 
      g2d.dispose(); 
     } 


    } 

} 
+0

感謝您花時間領導Java noob!我仍然不確定我是否喜歡Java。它非常令人沮喪lol – KyleK

+0

問題:由100d劃分。我如何填寫自己的變量並使其工作?因爲我想獲得我擁有的最高價值,並根據最大值計算所有其他價值。但是當我在那裏放入maxVolume變量時,單元格不繪製。 – KyleK

+0

使您的值標準化,使其在0-1(或更容易的0-100)之間變化,這會讓渲染器更輕鬆地完成它的工作 – MadProgrammer