我想動態地在java中的每個jlist
項目中添加jPanel
。其中jPanel
包含一個按鈕和進度條和標籤。並且jlist
在jlist
中的每個元組中包含jpanel
。如何在java中的每個jList項目中添加Jpanel
回答
JList不能保存組件,而只能保存組件的效果圖。所以簡而言之,你的請求不是直接可能的。 但是,你可以用一個JTable來保存JButton和JProgressBar和JLabel的可編輯渲染。與JTable最大的區別在於它的單元格是可編輯的,所以這個按鈕可以在這個環境中「工作」。
您可以通過查看鏈接到鞦韆教程和其他Swing資源在這裏找到更多:Swing Info
示例代碼:
- 注意,這裏使用羅布Camicker的令人驚訝的精彩ButtonColumn。文章可以找到here,代碼可以找到here。
- 這也從mKorbel的StackOverflow的答案代碼here
- 除了TrashGod的代碼借用發現here
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.event.SwingPropertyChangeSupport;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
@SuppressWarnings("serial")
public class ComplexTableEg extends JPanel {
private CTTableModel tableModel = new CTTableModel();
private JTable table = new JTable(tableModel);
public ComplexTableEg() {
StartProgressAction startProgressAction = new StartProgressAction(
"Start Progress", KeyEvent.VK_S);
new ButtonColumn(table, startProgressAction, 0);
table.getColumnModel().getColumn(2).setCellRenderer(new ProgressRenderer());
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new AddRowAction("Add Row", KeyEvent.VK_A)));
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private class AddRowAction extends AbstractAction {
public AddRowAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
int rowCount = tableModel.getRowCount() + 1;
CTRowData ctRow = new CTRowData("Row " + rowCount);
tableModel.addRow(ctRow);
}
}
private static void createAndShowGui() {
ComplexTableEg mainPanel = new ComplexTableEg();
JFrame frame = new JFrame("Complex Table Eg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
/**
* From mKorbel's StackOverflow answer
* @link: https://stackoverflow.com/a/7036206/522444
*
*/
class ProgressRenderer extends DefaultTableCellRenderer {
private final JProgressBar b = new JProgressBar(0, 100);
public ProgressRenderer() {
super();
setOpaque(true);
b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Integer i = (Integer) value;
String text = "Completed";
if (i < 0) {
text = "Error";
} else if (i < 100) {
b.setValue(i);
return b;
}
super.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column);
return this;
}
}
@SuppressWarnings("serial")
class StartProgressAction extends AbstractAction {
public StartProgressAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int rowIndex = Integer.parseInt(e.getActionCommand());
CTTableModel model = (CTTableModel) table.getModel();
CTRowData row = model.getRow(rowIndex);
row.startProcessing();
}
}
@SuppressWarnings("serial")
class CTTableModel extends AbstractTableModel {
public static final String[] COLUMN_HEADERS = { "Button", "Label",
"Progress" };
private List<CTRowData> dataList = new ArrayList<>();
@Override
public int getRowCount() {
return dataList.size();
}
public CTRowData getRow(int rowIndex) {
return dataList.get(rowIndex);
}
@Override
public int getColumnCount() {
return COLUMN_HEADERS.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
CTRowData row = dataList.get(rowIndex);
switch (columnIndex) {
case 0:
return CTRowData.START_PROCESSING;
case 1:
return row.getText();
case 2:
return row.getValue();
}
return null;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Integer.class;
}
// should never need this default
return super.getColumnClass(columnIndex);
}
@Override
public String getColumnName(int column) {
return COLUMN_HEADERS[column];
}
public void addRow(CTRowData row) {
dataList.add(row);
int firstRow = dataList.size() - 1;
fireTableRowsInserted(firstRow, firstRow);
row.addPropertyChangeListener(new RowDataListener(firstRow));
}
private class RowDataListener implements PropertyChangeListener {
private int row;
public RowDataListener(int row) {
this.row = row;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (CTRowData.VALUE.equals(evt.getPropertyName())) {
fireTableCellUpdated(row, 2);
}
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
boolean cellEditable = false;
if (columnIndex != 0) {
cellEditable = false;
} else {
cellEditable = true;
}
return cellEditable;
}
}
class CTRowData {
public static final String VALUE = "value";
public static final String PROCESSING = "processing";
public static final String START_PROCESSING = "Start Processing";
private static final int TIMER_DELAY = 500;
public static final int MAX_VALUE = 100;
private String text;
private boolean processing = false;
private int value = 0;
private Random random = new Random();
private SwingPropertyChangeSupport pcSupport = new SwingPropertyChangeSupport(
this);
public CTRowData(String text) {
this.text = text;
}
public boolean isProcessing() {
return processing;
}
public void setProcessing(boolean processing) {
boolean oldValue = this.processing;
boolean newValue = processing;
this.processing = processing;
pcSupport.firePropertyChange(PROCESSING, oldValue, newValue);
}
public void startProcessing() {
if (processing) {
return;
}
setProcessing(true);
setValue(0);
new Timer(TIMER_DELAY, new TimerListener()).start();
}
public String getText() {
return text;
}
public int getValue() {
return value;
}
public void setValue(int value) {
int oldValue = this.value;
int newValue = value;
this.value = value;
pcSupport.firePropertyChange(VALUE, oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcSupport.removePropertyChangeListener(listener);
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int temp = value;
temp += 5 + random.nextInt(10);
temp = Math.min(temp, MAX_VALUE);
setValue(temp);
if (temp >= MAX_VALUE) {
((Timer) e.getSource()).stop();
setProcessing(false);
}
}
}
}
那麼,如果你編寫一個自定義的'ListCellRenderer',它是_is_可能的:http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer。 –
@dudeprgm:除了創建一個*響應*按鈕之外,大部分都是可能的。同樣,這也是JTable與JList不同的地方。它不僅可以顯示多列渲染,其中JList只能顯示一列,還可以使其單元格可編輯,從而使渲染的按鈕起作用。 –
@dudeprgm:請參閱上面的示例程序。如果您可以使用JList和自定義的ListCellRenderer來複制此內容,請這樣做,在此發佈您的答案,向我發表評論以通知我,然後讓我投票給它。 –
- 1. 如何在JList中添加項目?
- 2. 在jlist netbeans上添加多個項目
- 3. 將JPanel添加到JList?
- 4. 將JList添加到JPanel
- 5. 將JList/JScrollPane添加到JPanel
- 6. 如何從同一個JPanel中的其他JLists中選擇JList中的項目
- 7. 將項目從jlist添加到jlist
- 8. 如何在JPanel,Java Swing中添加JToolBar?
- 9. 將項目添加到JList
- 10. Refusehing JList後添加項目
- 11. 將項目添加到jList
- 12. 添加項目到jList
- 13. 如何添加項目,在Java中
- 14. 圖像添加到一個JList項目
- 15. 添加滾動條到JList,JList被添加到JPanel
- 16. 如何在另一個JPanel的中心添加一個JPanel?
- 17. 在java中添加一個jpanel到jpanel中
- 18. JAVA在JLabel中顯示JList項目
- 19. 如何在Heroku中添加每個項目的付款?
- 20. 如何在最後的每個項目中添加字符串?
- 21. 將Java JPanel動態添加到Java中的另一個JPanel Swing
- 22. 如何添加Jpanel中的jpanel imagepanel?
- 23. JList的添加/刪除項目
- 24. 在Swing Java中向JList添加元素
- 25. 如何在java中顯示jList上的項目?
- 26. 如何在另一個JPanel中添加隨機座標的JPanel?
- 27. 如何在JDialog的JPanel中添加MapView以及另一個JPanel
- 28. Java JList在添加新項目後沒有正確響應
- 29. 如何在java中爲Jpanel添加3個矩形?
- 30. 如何在eclipse項目中將java添加到java聲音中?
注編輯與示例代碼來回答。 –