>>ScrollBar<<

Status
Nicht offen für weitere Antworten.

HalloWelt

Mitglied
Hi
Ich habe nun schon seit einer Ewigkeit das gleiche Problem und kann keine Lösung finden...
Ich habe eine Scrollbar mit der ich den Wert für ein sleep(...*Wert) setzen möchte. Doch solange das Programm in einer Methode ist, kann ich die Scrollbar nicht betätigen.

Hier mal den Code... Ich habe alles bis auf das Problem gelösch>>> die Ausgabe des Programms macht nicht mehr sehr viel sinn :).
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Sudoku extends JApplet
	implements  ActionListener, AdjustmentListener{

		int Faktor, Zahl;

		JPanel SudokuContent = new JPanel();
		JPanel SpielFeld = new JPanel();

		JPanel SudokuLöser = new JPanel();

		CWait Delay = new CWait();

		private JButton Lösen; //Funktionen Auswhal
		JScrollBar SetDelay = new JScrollBar(Scrollbar.HORIZONTAL, 500, 50, 1, 1000);
		public CPaintPanel PanelFeld = new CPaintPanel();


/***************************************************************/
			public void init(){

				setSize(600,600);

				SudokuContent.setLayout(new FlowLayout());

				PanelFeld.setPreferredSize(new Dimension(200,200));
				PanelFeld.setBackground(Color.yellow);
				SudokuContent.add(PanelFeld);
				SudokuContent.add(SudokuLöser);
				add(SudokuContent);

				Lösen = new JButton("Lösen");
				Lösen.addActionListener(this);

				SudokuLöser.setLayout(new GridLayout(2,1,2,2));
				SudokuLöser.setPreferredSize(new Dimension(150,60));
				SudokuLöser.add(Lösen);
				SetDelay.addAdjustmentListener(this);
				SudokuLöser.add(SetDelay);
			}

			public void paint(Graphics g){}

			public void actionPerformed(ActionEvent e){

				if(e.getSource() == Lösen){
					Output();
				}
			}
                            //Während diese Methode am laufen ist, kann die Scrollbar nicht verändert werden
			public void Output(){
				while(true){

					if(Zahl == 1){
						Zahl = 5;
					}
					else{
						Zahl = 1;
					}

					Graphics MyGraphic = PanelFeld.getGraphics();
					MyGraphic.setColor(Color.blue);
					MyGraphic.fillRect(100,100,40,40);
					MyGraphic.setColor(Color.white);
					MyGraphic.drawString(""+Zahl,110,125);//Zahl ausgeben*/

					Delay.many_mSec(Faktor);//<<<<<<<<<<<< mit der ScrollBar möchte ich den Faktor_Wert verändern
				}
			}

			public void adjustmentValueChanged(AdjustmentEvent e){
				Faktor = SetDelay.getValue();
			}

			/*******************************************/
			class CPaintPanel extends JPanel
			{
				private int OutputZahl;
				private Color SchriftFarbe;

				public void paintComponent(Graphics g){
					super.paintComponent(g);
				}
			}/*****************************************/


			class CWait {
				public void many_mSec(long s) {
					try {
						Thread.currentThread().sleep(1*s);
						}
						catch (InterruptedException e) {
						}
					}
			}/*********************************/
		}

Vielen Dank schon im Voraus.
 

hdi

Top Contributor
Kopier mal und starte:

[HIGHLIGHT="Java"]import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SwingThreading extends JFrame {

private JSlider slider;
private JLabel stepLabel;
private long step;
private int speed;

public SwingThreading() {
super("Swing Program on Event Dispatch Thread");

slider = new JSlider(1, 100);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
speed = slider.getValue();
}
});

speed = 50;
stepLabel = new JLabel("0");

setLayout(new BorderLayout());
add(slider, BorderLayout.SOUTH);
add(stepLabel, BorderLayout.CENTER);

pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public int getSpeed() {
return speed;
}

public void nextStep() {
step++;
stepLabel.setText(step + "");
}

/* PROGRAM START */
public static void main(String[] args) {

final SwingThreading st = new SwingThreading();
st.setVisible(true);

new Thread() {
@Override
public void run() {
while (true) {
st.nextStep();
try {
Thread.sleep(101 - st.getSpeed());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}[/HIGHLIGHT]

Läuft erstaunlicherweise sogar ohne irgendein invokeLater() auf dem EDT.
Hingegen läuft es aber nicht mit EDT, wenn man keinen neuen - separaten - Thread macht.
Finde das auch alles komisch, und hab mehr rumgeraten als ich das geschrieben hab.
Das Thema Swing und Threads ist einfach madig... Ich programmier jetz auch schon
seit 2+ Jahren in Java, und verstehe das ganze noch immer nicht mal annähernd.
Ich kopiere einfach immer Dinge auf den EDT, starte neue Threads etc. bis es geht :confused:

Warum der Code jetzt also funktioniert, und warum andere Varianten nicht funktionieren,
kann ich dir leider auch nicht sagen :(

Ich hab neulich was gemacht da wurde auch gezeichnet und man konnte Slider
rumschieben usw, und im Hintergrund lief ein Nonstop-Thread. Da lief das ohne Probs
auf dem EDT, und hier geht's jetzt nicht...

Fände es echt mal super, wenn ein Crack da mal einen guten Guide drüber schreibt.
Sodass man nicht immer testen und raten muss, sondern es mal WEISS, wann es Probs
gibt und wann nicht.
Anyone?
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben