我現在正在爲一個學校的小項目工作,而且我對使用的JSpinners有一個很大的問題。我有三個JSpinners,它們的最大值是8,但是三個JSpinners的所有數字一起不能超過20.所以我們假設三個Spinners是A,B和C,並且我已經將A和B一直切換到8,那麼C應該只能達到4.如果我將A切換回4,我可以將C全部切換到8,依此類推。問題是,我無法在JSpinner中找到任何支持此方法的方法。如果有人知道我能做到這一點,我會非常感激。Java Swing讓JSpinner停止加起來
0
A
回答
0
你可以這樣創建一個JSpinnerModel:
SpinnerModel sm = new SpinnerNumberModel(0, 0, 8, 1);
JSpinner spinner = new JSpinner(sm);
你需要一個變化監聽所有JSpinners。當你增加或減少一個微調器時,你增加/減少所有三個微調器的總和。您可以添加一個ChangeListener這樣的:
aSpinner.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent event) {
//count and update here
}
});
然後你遍歷JSpinners,併爲他們每個人一個新的SpinnerModel,與新的最大值,並將其設置爲JSpinner的。
例如: A:8,B:7,C:0。您現在正在增加B到8,那麼你一共是16 您創建一個新的SpinnerModel,並把它添加到JSpinner的爲C:
SpinnerModel sm = new SpinnerNumberModel(0, 0, 20-16, 1);
cSpinner.setModel(sm);
我希望,可以幫助!
1
您可以繼承JSpinner
和覆蓋getNextValue
,做的情況下,接下來的值會太高,做其平常的東西(return super.getNextValue()
)無(return null
),如果它不是。
在JSpinner
的每個上註冊ChangeListener
。
當發生ChangeEvent
時,只需重新計算當前總計。
下面是一個例子:
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Spinners implements ChangeListener {
private int currentTotal = 15;
private final int maxTotal = 20;
private final JSpinner[] spins = new JSpinner[3];
public Spinners() {
JFrame frame = new JFrame();
JPanel content = new JPanel(new GridLayout(3, 1));
for (int i = 0; i < 3; i++) {
SpinnerModel model = new SpinnerNumberModel(5, //initial value
1, //min
10, //max
1); //step
JSpinner spinner = new AutoBlockSpinner();
spinner.setModel(model);
spinner.addChangeListener(this);
spins[i] = spinner;
content.add(spinner);
}
computeCurrentTotal();
frame.setContentPane(content);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
}
private void computeCurrentTotal() {
currentTotal = 0;
for (JSpinner spin : spins) {
currentTotal += (Integer) spin.getModel().getValue();
}
}
@Override
public void stateChanged(final ChangeEvent e) {
computeCurrentTotal();
}
public static void main(final String[] args) {
Spinners spinners = new Spinners();
}
class AutoBlockSpinner extends JSpinner {
@Override
public Object getNextValue() {
if (currentTotal + 1 <= maxTotal) {
return super.getNextValue();
} else {
return null;
}
}
}
}
1
下面是創建一個自定義SpinnerModel
的方法。然後將每個模型鏈接到其他模型以形成一個組。
基本上,代碼覆蓋SpinnerModel
的getNextValue()
方法,以確定您是否處於最大值。該值僅在您低於組最大值時更新。
只能提高紡紗爲10,總價值:
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
public class GroupSpinner
{
private int groupMaximum;
private List<GroupSpinnerNumberModel> models = new ArrayList<GroupSpinnerNumberModel>();
public GroupSpinner(int maximum)
{
this.groupMaximum = maximum;
}
public SpinnerNumberModel createGroupModel(int value, int minimum, int maximum, int step)
{
GroupSpinnerNumberModel model = new GroupSpinnerNumberModel(value, minimum, maximum, step, this);
models.add(model);
return model;
}
public Object getNextValue(int currentValue, int step)
{
int maximum = getGroupValue() + step;
if (maximum > groupMaximum)
{
return currentValue;
}
else
{
groupValueUpdated(maximum);
int nextValue = currentValue + step;
return nextValue;
}
}
public int getGroupValue()
{
int maximum = 0;
for (GroupSpinnerNumberModel model: models)
{
maximum += model.getNumber().intValue();
}
return maximum;
}
private void groupValueUpdated(int value)
{
System.out.println(value);
}
public class GroupSpinnerNumberModel extends SpinnerNumberModel
{
private GroupSpinner model;
public GroupSpinnerNumberModel(int value, int minimum, int maximum, int step, GroupSpinner model)
{
super(value, minimum, maximum, step);
this.model = model;
}
public Object getNextValue()
{
int currentValue = super.getNumber().intValue();
int step = super.getStepSize().intValue();
return model.getNextValue(currentValue, step);
}
}
private static void createAndShowGUI()
{
JPanel panel = new JPanel(new GridLayout(0, 1));
GroupSpinner group = new GroupSpinner(10);
JSpinner number1 = new JSpinner(group.createGroupModel(0, 0, 10, 1));
panel.add(number1);
panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1)));
panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1)));
panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1)));
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(() -> createAndShowGUI());
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
相關問題
- 1. Java Swing - JSpinner中的問題
- 2. 在java swing中禁用jspinner
- 3. Android等價於Java的Swing JSpinner
- 4. Java Swing看起來像Windows
- 5. 停止計時器在java Swing
- 6. 如何通過按下Java Swing按鈕來停止線程?
- 7. 從JSpinner獲取價值(SWING)
- 8. JavaFX相當於Swing的JSpinner?
- 9. 如何停止Swing EDT
- 10. JSpinner來源?
- 11. 防止jSpinner中的負值
- 12. 的Java Swing的JSpinner與NumberEditor顯示空白,而不是零
- 13. 如何暫停Java Swing Timer?
- 14. 讓JSpinner完全數字化
- 15. 讓jQuery mousemove停止
- 16. 讓ListView ItemCheck停止!
- 17. 停止舊會話列表對象加起來
- 18. JAVA Swing Gui窗口掛起
- 19. Java swing形式掛起
- 20. CPU模式在3-4回合後停止播放(JAVA SWING)
- 21. Java Swing 2D遊戲 - 在CardLayout開關後EventQueue停止發射
- 22. Java Swing ActionListener不工作並停止構造函數
- 23. Java GUI/Swing,停止線程,在類之間傳遞整數
- 24. 當特定值達到時停止Java swing定時器
- 25. 爲什麼Swing應用程序會停止我的Java servlet?
- 26. 爲什麼java swing定時器自動停止?
- 27. 的Java Swing顯示停止更新,直到X事件產生
- 28. 如何停止在java swing中執行的動作
- 29. Java Swing KeyBindings僅在Mac上停止工作
- 30. 讓球停下來
哼哼,改變模型實例完美(則 - )選擇有效的值,即使會失去先前的選擇。 –
您可以將舊值添加爲模型構造函數中的默認值。 – GAlexMES
謝謝你的回答。但是這不需要大量不同的模型嗎?假設我將第一個A切換到7,B切換到7,那麼C的最大值將是6.我必須爲每個可能的組合編寫一個模型,或者我錯了嗎? – Brainworm