복붙노트

[SCALA] JTable의에서 JProgressBar가이 업데이트되지

SCALA

JTable의에서 JProgressBar가이 업데이트되지

왜 진행 다음 코드 업데이트에있는 바, 나는 그들에게 어떻게 얻을 것합니까?

import java.awt.event.{ActionListener, ActionEvent}
import javax.swing.table.{TableCellRenderer, AbstractTableModel}
import javax.swing.{Timer, JTable, JProgressBar, JFrame}

object TestProgressBar {
  val frame = new JFrame()
  val model = new TestModel()
  val table = new JTable(model)

  class TestModel extends AbstractTableModel {
    def getColumnCount = 4

    def getRowCount = 4

    def getValueAt(y: Int, x: Int) = "%d,%d".format(x, y)

    override def setValueAt(value: Any, row: Int, col: Int) {
      if (col == 0) {
        model.fireTableCellUpdated(row, col);
      }
    }
  }

  class TestCellRenderer extends TableCellRenderer with ActionListener {
    val progressBar = new JProgressBar()
    val timer = new Timer(100, this)

    progressBar.setIndeterminate(true)
    timer.start()

    override def getTableCellRendererComponent(tbl: JTable, value: AnyRef,
                                               isSelected: Boolean,
                                               hasFocus: Boolean,
                                               row: Int, column: Int) = {
      progressBar
    }

    override def actionPerformed(e: ActionEvent) {
      val model = table.getModel
      for (row <- 0 to model.getRowCount) {
        model.setValueAt(0, row, 0)
      }
    }
  }

  def main(args: Array[String]) {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

    table.getColumnModel.getColumn(0).setCellRenderer(new TestCellRenderer())

    frame.add(table)

    frame.pack()
    frame.setVisible(true)
  }
}

해결법

  1. ==============================

    1.모델이 업데이트 될 때 @Robin 노트로, 내의 렌더러 만 불러 일으켰다. 주기적으로 원하는 행 (들)의 값을 변경해야합니다. 이 예는 javax.swing.Timer를 사용합니다.

    모델이 업데이트 될 때 @Robin 노트로, 내의 렌더러 만 불러 일으켰다. 주기적으로 원하는 행 (들)의 값을 변경해야합니다. 이 예는 javax.swing.Timer를 사용합니다.

    private class TestCellRenderer implements TableCellRenderer, ActionListener {
    
        JProgressBar bar = new JProgressBar();
    
        Timer timer = new Timer(100, this);
    
        public TestCellRenderer() {
            bar.setIndeterminate(true);
            timer.start();
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return bar;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            TableModel model = table.getModel();
            for (int row = 0; row < model.getRowCount(); row++) {
                table.getModel().setValueAt(0, row, 0);
            }
        }
    }
    

    AbstractTableModel가 구현이 비어 된대로의 setValueAt ()를 구현할 수 있습니다 :

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        if (col == 1) {
            // update your internal model and notify listeners
            this.fireTableCellUpdated(row, col);
        }
    }
    

    부록 : 참고로, 여기에 스칼라를 보완하기 위해 해당 Java 구현입니다.

    암호:

    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.Timer;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableModel;
    
    /**
    * @see http://stackoverflow.com/a/10491290/230513
    */
    public class TestProgressBar extends JPanel {
    
        private JTable table = new JTable(new TestModel());
        public TestProgressBar() {
            table.getColumnModel().getColumn(0).setCellRenderer(new TestCellRenderer());
            table.setPreferredScrollableViewportSize(new Dimension(320, 120));
            this.add(new JScrollPane(table));
        }
    
        private class TestModel extends AbstractTableModel {
    
            @Override
            public int getRowCount() {
                return 4;
            }
    
            @Override
            public int getColumnCount() {
                return 4;
            }
    
            @Override
            public Object getValueAt(int row, int col) {
                return String.valueOf(row) + ", " + String.valueOf(col);
            }
    
            @Override
            public void setValueAt(Object aValue, int row, int col) {
                // update internal model and notify listeners
                fireTableCellUpdated(row, col);
            }
        }
    
        private class TestCellRenderer implements TableCellRenderer, ActionListener {
    
            JProgressBar bar = new JProgressBar();
            Timer timer = new Timer(100, this);
    
            public TestCellRenderer() {
                bar.setIndeterminate(true);
                timer.start();
            }
    
            @Override
            public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                return bar;
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                TableModel model = table.getModel();
                for (int row = 0; row < model.getRowCount(); row++) {
                    table.getModel().setValueAt(0, row, 0);
                }
            }
        }
    
        private void display() {
            JFrame f = new JFrame("TestProgressBar");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestProgressBar().display();
                }
            });
        }
    }
    
  2. ==============================

    2.확실하지 스칼라에 대해,하지만 스윙에 TableRenderer에 의해 반환되는 요소는 단지 '스탬프'를 만드는 데 사용됩니다. 실제 구성 요소는 그것의 우표 JTable로에 포함되지 않도록. 당신이 나중에 구성 요소를 업데이트 할 경우, 이것은`JTable에 반영되지 않습니다 것을 의미한다.

    확실하지 스칼라에 대해,하지만 스윙에 TableRenderer에 의해 반환되는 요소는 단지 '스탬프'를 만드는 데 사용됩니다. 실제 구성 요소는 그것의 우표 JTable로에 포함되지 않도록. 당신이 나중에 구성 요소를 업데이트 할 경우, 이것은`JTable에 반영되지 않습니다 것을 의미한다.

    가장 큰 장점은 렌더러에서 구성 요소를 재사용 할 수 있다는 것입니다. 예를 들면 문자열을 렌더링하기 위해, 당신은 당신이 텍스트를 업데이트하고 렌더링 반환을 할 수있는 하나 개의 JLabel의 인스턴스가 필요합니다.

    스윙 테이블 자습서의 렌더러 부분은 더 자세하게 설명

  3. ==============================

    3.나는 JProgressBar가의 isDisplayable 및 다시 그리기 방법을 재정 의하여 문제를 해결 한 것 같다.

    나는 JProgressBar가의 isDisplayable 및 다시 그리기 방법을 재정 의하여 문제를 해결 한 것 같다.

    import javax.swing.table.{TableCellRenderer, AbstractTableModel}
    import javax.swing.{JTable, JProgressBar, JFrame}
    
    object TestProgressBar {
      val frame = new JFrame()
      val model = new TestModel()
      val table = new JTable(model)
    
      class TestModel extends AbstractTableModel {
        def getColumnCount = 4
    
        def getRowCount = 4
    
        def getValueAt(y: Int, x: Int) = "%d,%d".format(x, y)
      }
    
      class TestCellRenderer extends TableCellRenderer {
        val progressBar = new JProgressBar() {
          override def isDisplayable = true
          override def repaint() { table.repaint() }
        }
    
        progressBar.setIndeterminate(true)
    
        override def getTableCellRendererComponent(tbl: JTable, value: AnyRef,
                                                   isSelected: Boolean,
                                                   hasFocus: Boolean,
                                                   row: Int, column: Int) = {
          progressBar
        }
      }
    
      def main(args: Array[String]) {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    
        table.getColumnModel.getColumn(0).setCellRenderer(new TestCellRenderer())
    
        frame.add(table)
    
        frame.pack()
        frame.setVisible(true)
      }
    }
    
  4. from https://stackoverflow.com/questions/10486931/jprogressbar-in-jtable-not-updating by cc-by-sa and MIT license