[SCALA] JTable의에서 JProgressBar가이 업데이트되지
SCALAJTable의에서 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.모델이 업데이트 될 때 @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.확실하지 스칼라에 대해,하지만 스윙에 TableRenderer에 의해 반환되는 요소는 단지 '스탬프'를 만드는 데 사용됩니다. 실제 구성 요소는 그것의 우표 JTable로에 포함되지 않도록. 당신이 나중에 구성 요소를 업데이트 할 경우, 이것은`JTable에 반영되지 않습니다 것을 의미한다.
확실하지 스칼라에 대해,하지만 스윙에 TableRenderer에 의해 반환되는 요소는 단지 '스탬프'를 만드는 데 사용됩니다. 실제 구성 요소는 그것의 우표 JTable로에 포함되지 않도록. 당신이 나중에 구성 요소를 업데이트 할 경우, 이것은`JTable에 반영되지 않습니다 것을 의미한다.
가장 큰 장점은 렌더러에서 구성 요소를 재사용 할 수 있다는 것입니다. 예를 들면 문자열을 렌더링하기 위해, 당신은 당신이 텍스트를 업데이트하고 렌더링 반환을 할 수있는 하나 개의 JLabel의 인스턴스가 필요합니다.
스윙 테이블 자습서의 렌더러 부분은 더 자세하게 설명
-
==============================
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) } }
from https://stackoverflow.com/questions/10486931/jprogressbar-in-jtable-not-updating by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라에서 변수 이름으로 "형"단어를 사용하는 방법이 있나요? (0) | 2019.11.24 |
---|---|
[SCALA] SBT 0.13.11 프록시 뒤에 종속성을 다운로드 할 수 없습니다 (0) | 2019.11.24 |
[SCALA] 무기 호는 목록의 마지막에 요구되는 이유는 단점 연산자를 사용하여 구축 (0) | 2019.11.24 |
[SCALA] 어떻게 단순 무작위 표본 추출 및 아파치 스파크 (스칼라)에서 dataframe SAMPLE 기능 일을? (0) | 2019.11.24 |
[SCALA] ImageIO.write를 사용하여 품질 손실 (0) | 2019.11.24 |