|
You last visited: Today at 08:57
Advertisement
refreshing GUI Labels
Discussion on refreshing GUI Labels within the Java forum part of the Coders Den category.
04/29/2015, 23:07
|
#1
|
elite*gold: 76
Join Date: Jun 2012
Posts: 1,043
Received Thanks: 216
|
refreshing GUI Labels
Hi,
Mein Problem ist kurz erklärt.
Ich habe ein GUI erstellt, in das man 3 Eingaben tätigen kann. Einmal die Länge (einer img-Datei), den Dateinamen und einen counter.
Nun ist es so, dass ich Listen von Daten habe. Diese haben bis 22,5 Mio. Elemente. Wurzel von 22,5 Mio sind ca. 4743. Bei einem quadratischen Bild ergibt das die maximale Seitenlänge.
Der Counter ist dafür da um jedes xte Element zu nehmen. Bei einem Counter von 2 wäre es dann: 22,5 Mio./sqrt(2)= max. Seitenlänge des Bildes.
Nun möchte ich, dass wenn man die Zahl für den Counter in das Textfeld eingibt, dass unter dem Feld für die Länge ein kleiner Text steht, der die maximale Länge angibt. Die Formel von oben habe ich ja. Aber wie kann ich es schaffen, damit meine GUI sich automatisch aktualisiert ohne, dass ich einen Button betätige? Also, ich gebe eine Zahl für den Counter in das Textfeld ein und der Hinweis ändert sich direkt.
Mfg
EinfachSö
Code:
Code:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import javax.swing.SwingConstants;
import java.awt.Toolkit;
import java.awt.Color;
import java.io.IOException;
public class GUI extends JFrame {
private JPanel contentPane;
private JTextField textLength;
private JTextField textDataName;
private JTextField textCounter;
private JLabel lblLength;
private JLabel lblCounter;
private JLabel lblNameOfData;
private JLabel lblMaxResolution;
/**
* Set the variables for the max Length indicator
*/
private double maxlen = 4743;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI frame = new GUI();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public GUI() {
setTitle("UlamSpiral");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 140, 214);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnCreateImage = new JButton("Create Image");
btnCreateImage.setFont(new Font("Tahoma", Font.PLAIN, 11));
btnCreateImage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int length = Integer.parseInt(textLength.getText());
String data = textDataName.getText();
Main temp = new Main();
temp.method(length, data);
}
});
btnCreateImage.setBounds(10, 145, 104, 25);
contentPane.add(btnCreateImage);
//Labels
lblLength = new JLabel("Length:");
lblLength.setBounds(10, 11, 46, 14);
contentPane.add(lblLength);
lblNameOfData = new JLabel("Name of Data:");
lblNameOfData.setBounds(10, 65, 99, 14);
contentPane.add(lblNameOfData);
lblCounter = new JLabel("Counter:");
lblCounter.setBounds(10, 105, 104, 14);
contentPane.add(lblCounter);
lblMaxResolution = new JLabel("(Max.Length:)");
lblMaxResolution.setFont(new Font("Tahoma", Font.PLAIN, 9));
lblMaxResolution.setForeground(Color.RED);
lblMaxResolution.setBounds(10, 51, 104, 14);
contentPane.add(lblMaxResolution);
//Text-Felder
textLength = new JTextField();
textLength.setBounds(10, 28, 104, 20);
contentPane.add(textLength);
textLength.setColumns(10);
textDataName = new JTextField();
textDataName.setBounds(10, 82, 104, 20);
contentPane.add(textDataName);
textDataName.setColumns(10);
textCounter = new JTextField();
textCounter.setText("1");
textCounter.setBounds(10, 122, 104, 20);
contentPane.add(textCounter);
textCounter.setColumns(10);
/**
* Calculate the Max Length and show it
*/
}
}
Möglicher Code für das "Feature"
Code:
try
{
int counter = Integer.parseInt(textCounter.getText());
double temp = maxlen/Math.sqrt(counter);
lblMaxResolution.setText("(Max.Length:" + (int) temp + ")");
}
catch(NumberFormatException e)
{
System.err.println(e);
}
|
|
|
04/30/2015, 12:07
|
#2
|
elite*gold: 20
Join Date: Jan 2009
Posts: 304
Received Thanks: 55
|
Du hast die Optionen einen ActionListener zu registrieren auf deinem TextFeld, hast du es damit versucht?
Weitere Alternativen wäre ein KeyListener der bei jeder Zeicheneingabe überprüft ob der "gewünschte" bzw. erwartete Wert eingegeben wurde. Oder du könntest für jede Zeicheneingabe einen kurzen Timeout registrieren und wenn danach kein neues Zeichen eingegeben wird, aktualisierst du das Label.
Ansonsten habe ich bei StackOverflow vermehrt sowas gesehen:
Code:
textField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
// text changed?
}
public void removeUpdate(DocumentEvent e) {}
public void insertUpdate(DocumentEvent e) {
// text inserted?
}
});
Habe ich selber aber noch nicht benutzt.
|
|
|
05/01/2015, 17:39
|
#3
|
elite*gold: 76
Join Date: Jun 2012
Posts: 1,043
Received Thanks: 216
|
Quote:
Originally Posted by RecK
Du hast die Optionen einen ActionListener zu registrieren auf deinem TextFeld, hast du es damit versucht?
Weitere Alternativen wäre ein KeyListener der bei jeder Zeicheneingabe überprüft ob der "gewünschte" bzw. erwartete Wert eingegeben wurde. Oder du könntest für jede Zeicheneingabe einen kurzen Timeout registrieren und wenn danach kein neues Zeichen eingegeben wird, aktualisierst du das Label.
Ansonsten habe ich bei StackOverflow vermehrt sowas gesehen:
Code:
textField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
// text changed?
}
public void removeUpdate(DocumentEvent e) {}
public void insertUpdate(DocumentEvent e) {
// text inserted?
}
});
Habe ich selber aber noch nicht benutzt.
|
Mit einem ActionListener klappt es nicht. Auch laut anderer Aussagen.
Der KeyListener stellt mich im Moment noch vor eine Herausforderung. Er will das Label nicht ändern. Ich habe gelesen, dass man darauf achten muss, was das Programm fokussiert und es da viele Probleme gibt.
Ich designe das Programm lieber etwas um. Es gibt zum Glück keinen Error, wenn die max. Länge überschritten wird. Das Ergebnis wird bloß unschön. (Bild mit weißen Rändern.
|
|
|
05/01/2015, 20:31
|
#4
|
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 178
|
Der ActionListener muss eigentlich funktionieren. Wird nix getriggert, oder was ist das Problem?
|
|
|
05/02/2015, 02:21
|
#5
|
elite*gold: 0
Join Date: Apr 2008
Posts: 8,649
Received Thanks: 5,465
|
Nun mit Swing habe ich anfängliche Kenntnisse und bin anfangs auch auf viele Probleme gestoßen.. Soweit ich mich erinnere können zumindest einige initialisierte Komponenten nicht verändert werden. Nutz einfach JavaFX, dort solltest du auf solche Probleme nicht stoßen. Desweiteren wird das in den nächsten Jahren Swing sowieso ersetzen, da es schon länger kein vernünftiges Update hatte und somit vieles veraltet ist..
Zum eigentlichen Problem:
In JavaFX gibt es einen OnChange Event für Textfelder dass jedes mal ausgeführt wird, sobald sich der Inhalt ändert. Du müsstest dann vorher einfach überprüfen ob eine gültige Zahl im Feld steht und deine Berechnung durchführen, die dann einfach den Inhalt des Labels setzt..
|
|
|
05/02/2015, 13:38
|
#6
|
elite*gold: 0
Join Date: Mar 2013
Posts: 3,185
Received Thanks: 1,317
|
Code:
jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
jTextField1KeyTyped(evt);
}
});
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
jLabel1.setText(jTextField1.getText());
}
Und das war es auch schon.
Ansonsten benutzt du einfach das ActionPerformed-Event. Da muss der Nutzer zwar mit Enter bestätigen, aber dafür ist es weniger Fehleranfällig.
Ich würde dir auch JavaFX ans Herz legen in Verbindung mit dem Scene Builder. Allerdings solltest du eine gute Struktur im Quellcode haben, da ein größeres Projekt recht schnell unübersichtlich wird.
*Edit: Der DocumentListener ist natürlich um einiges eleganter:
Code:
jTextField1.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
}
public void removeUpdate(DocumentEvent e) {
}
public void insertUpdate(DocumentEvent e) {
jLabel1.setText(jTextField1.getText());
}
});
|
|
|
 |
Similar Threads
|
Wie zählt man 2 labels zoder variablen zusammen?
06/23/2012 - AutoIt - 3 Replies
Hallo,
Ich bräuchte etwas Hilfe wie man 2 variablen, bzw. 2 Labels zusammenzählt.
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
|
Rappelz - Using Shell with labels/listview items.
04/11/2012 - .NET Languages - 2 Replies
This is my code :
Shell(Label4.Text & "\" & "SFrame.exe /auth_ip:" & ListView1.SelectedItems(0).SubItems(1).Text & " /locale:ASCII /country:US /cash /commercial_shop")
When I execute that command, I get an error from SFrame :
http://i44.tinypic.com/mhdp5g.jpg
What am I doing wrong? What's the correct way?
|
HELP! SCHWEBENDE LABELS?!?
06/05/2010 - AutoIt - 10 Replies
hi leute!
ich hab ne gui gemacht...
und kann mir einer sagen wie ich schwebende labels machen kann??
danke im voraus...
|
Request: Metallurgy Labels in Nekojima
04/04/2010 - Mabinogi - 4 Replies
If anyone can provide a tutorial on how to make this edit, it would be greatly appreciated. The spot do get kind of annoying to see when it's daylight.
|
All times are GMT +1. The time now is 09:02.
|
|