JPanlels und Labels.

Status
Nicht offen für weitere Antworten.
D

dociman

Gast
Hi,

habe folgenden Code, doch macht er nicht was ich erwarte, denn beim ausführen, sind die sachen nicht sauber unereinander, obwohl im code schon..?. verstehe auch nicht warum manche Panels geordnet sind und manche nicht..wollte es erst mit JTable machen war mir aber dann zu aufwendig...
..wo liegt denn nun das problem?..
und..gibt es da noch eine bessere oder elegantere lösung?

danke....

hier der Code:

Code:
import java.awt.*;

import javax.swing.*;

public class DrinksView {

	
	
	
	private JLabel bezeichner   = new JLabel("DishNr                     Name                     Price(Euro)                Number");
	private JLabel l1           = new JLabel("");
	private JLabel l2           = new JLabel("Drinks without alcohol");
	private JLabel l3           = new JLabel("");
	private JLabel l4           = new JLabel("Cool");
	private JLabel l5           = new JLabel("14                        Coca Cola                  2.10");
	private JLabel l6           = new JLabel("15                      	Orange Juice		       2.50");
	private JLabel l7           = new JLabel("16                      	Bitter Lemon		       2.50");
	private JLabel l8           = new JLabel("17 	                    Tonic Water	               2.50");
	private JLabel l9           = new JLabel("Hot");
	private JLabel l10          = new JLabel("18                    	Coffee, black              2.20");
	private JLabel l11          = new JLabel("19						Coffee, white		       2.20");
	private JLabel l12          = new JLabel("20						Espresso 				   2.50");
	private JLabel l13          = new JLabel("21						Cappuccino	     		   2.70");
	private JLabel l14          = new JLabel("");
	private JLabel l15          = new JLabel("Alcoholic");
	private JLabel l16          = new JLabel("22						Johnny Walker		 	   3.60");
	private JLabel l17          = new JLabel("23						wheat beer                 3.50");
	private JTextField   fieldDish14 = new JTextField(2);
	private JTextField   fieldDish15 = new JTextField(2);
	private JTextField   fieldDish16 = new JTextField(2);
	private JTextField   fieldDish17 = new JTextField(2);
	private JTextField   fieldDish18 = new JTextField(2);
	private JTextField   fieldDish19 = new JTextField(2);
	private JTextField   fieldDish20 = new JTextField(2);
	private JTextField   fieldDish21 = new JTextField(2);
	private JTextField   fieldDish22 = new JTextField(2);
	private JTextField   fieldDish23 = new JTextField(2);
	
	private JButton buttonDish14 = new JButton("n");
	private JButton buttonDish15 = new JButton("n");
	private JButton buttonDish16 = new JButton("n");
	private JButton buttonDish17 = new JButton("n");
	private JButton buttonDish18 = new JButton("n");
	private JButton buttonDish19 = new JButton("n");
	private JButton buttonDish20 = new JButton("n");
	private JButton buttonDish21 = new JButton("n");
	private JButton buttonDish22 = new JButton("n");
	private JButton buttonDish23 = new JButton("n");
	
	
	public DrinksView(){
		super();
		
    bezeichner.setForeground(Color.WHITE);
    l1.setPreferredSize(new Dimension(250,13));
    l2.setPreferredSize(new Dimension(250,13));
    l3.setPreferredSize(new Dimension(250,13));
    l4.setPreferredSize(new Dimension(250,13));
    l5.setPreferredSize(new Dimension(250,13));
    l6.setPreferredSize(new Dimension(250,13));
    l7.setPreferredSize(new Dimension(250,13));
    l8.setPreferredSize(new Dimension(250,13));
    l9.setPreferredSize(new Dimension(250,13));
    l10.setPreferredSize(new Dimension(250,13));
    l11.setPreferredSize(new Dimension(250,13));
    l12.setPreferredSize(new Dimension(250,13));
    l13.setPreferredSize(new Dimension(250,13));
    l14.setPreferredSize(new Dimension(250,13));
    l15.setPreferredSize(new Dimension(250,13));
    l16.setPreferredSize(new Dimension(250,13));
    l17.setPreferredSize(new Dimension(250,13));
    
    
    buttonDish14.setPreferredSize(new Dimension(45,20));
    buttonDish14.setBackground(Color.GREEN);
    buttonDish15.setPreferredSize(new Dimension(45,20));
    buttonDish15.setBackground(Color.GREEN);
    buttonDish16.setPreferredSize(new Dimension(45,20));
    buttonDish16.setBackground(Color.GREEN);
    buttonDish17.setPreferredSize(new Dimension(45,20));
    buttonDish17.setBackground(Color.GREEN);
    buttonDish18.setPreferredSize(new Dimension(45,20));
    buttonDish18.setBackground(Color.GREEN);
    buttonDish19.setPreferredSize(new Dimension(45,20));
    buttonDish19.setBackground(Color.GREEN);
    buttonDish20.setPreferredSize(new Dimension(45,20));
    buttonDish20.setBackground(Color.GREEN);
    buttonDish21.setPreferredSize(new Dimension(45,20));
    buttonDish21.setBackground(Color.GREEN);
    buttonDish22.setPreferredSize(new Dimension(45,20));
    buttonDish22.setBackground(Color.GREEN);
    buttonDish23.setPreferredSize(new Dimension(45,20));
    buttonDish23.setBackground(Color.GREEN);
 
    
    
    JPanel pDish = new JPanel();
    
    JPanel pDish1 = new JPanel();
    JPanel pDish2 = new JPanel();
    JPanel pDish3 = new JPanel();
    JPanel pDish4 = new JPanel();
    JPanel pDish5 = new JPanel();
    JPanel pDish6 = new JPanel();
    JPanel pDish7 = new JPanel();
    JPanel pDish8 = new JPanel();
    JPanel pDish9 = new JPanel();
    JPanel pDish10 = new JPanel();
    JPanel pDish11 = new JPanel();
    JPanel pDish12 = new JPanel();
    JPanel pDish13 = new JPanel();
    JPanel pDish14 = new JPanel();
    JPanel pDish15 = new JPanel();
    JPanel pDish16 = new JPanel();
    JPanel pDish17 = new JPanel();
    
    pDish1.add(l1);
    pDish2.add(l2);
    pDish3.add(l3);
    pDish4.add(l4);
    
    pDish5.add(l5);
    pDish5.add(fieldDish14);
    pDish5.add(buttonDish14);
    
    pDish6.add(l6);
    pDish6.add(fieldDish15);
    pDish6.add(buttonDish15);
    
    pDish7.add(l7);
    pDish7.add(fieldDish16);
    pDish7.add(buttonDish16);
    
    pDish8.add(l8);
    pDish8.add(fieldDish17);
    pDish8.add(buttonDish17);
    
    pDish9.add(l9);
    
    pDish10.add(l10);
    pDish10.add(fieldDish18);
    pDish10.add(buttonDish18);
    
    pDish11.add(l11);
    pDish11.add(fieldDish19);
    pDish11.add(buttonDish19);
    
    pDish12.add(l12);
    pDish12.add(fieldDish20);
    pDish12.add(buttonDish20);
    
    pDish13.add(l13);
    pDish13.add(fieldDish21);
    pDish13.add(buttonDish21);
    
    pDish14.add(l14);
    pDish15.add(l15);
    
    pDish16.add(l16);
    pDish16.add(fieldDish22);
    pDish16.add(buttonDish22);
    
    pDish17.add(l17);
    pDish17.add(fieldDish23);
    pDish17.add(buttonDish23);
    
   pDish.setLayout(new GridLayout(18,1)); 
    pDish.add(bezeichner);
    pDish.add(pDish1);
    pDish.add(pDish2);
    pDish.add(pDish3);
    pDish.add(pDish4);
    pDish.add(pDish5);
    pDish.add(pDish6);
    pDish.add(pDish7);
    pDish.add(pDish8);
    pDish.add(pDish9);
    pDish.add(pDish10);
    pDish.add(pDish11);
    pDish.add(pDish12);
    pDish.add(pDish13);
    pDish.add(pDish14);
    pDish.add(pDish15);
    pDish.add(pDish16);
    pDish.add(pDish17);
    
    
    
    
    Container c = getContentPane();

        c.add(pDish);

        c.setLayout(new FlowLayout());

        setTitle("DRINKS");
        setSize(440, 600);
        setVisible(true);

    }

}
 
R

Roar

Gast
UFF...
wieso benutzt du nicht eine JTable? oder schrieb den namen der namen der getränke in eine spalte, den preis in eine andere spalte (im gridlayout)...
 
D

dociman

Gast
..hmm :( ..anstatt zu sagen was ich falsch gemacht habe oder wie ich es besser machen kann...heisst es ..harter Code..

..also es wäre ja schon toll wenn ich eine vernünftige antwort bekomme..danke..
 
B

Beni

Gast
Du hast eigentlich nichts "falsch" gemacht, nur sind ein paar Leerzeichen zuviel / zuwenig vorhanden.

Dummerweise ist aber die Schriftart für die Breite von Zeichen verantwortlich; setzt du eine andere Schriftart, müssen auch wieder eine andere Anzahl Leerzeichen vorhanden sein...

Du könntest noch mehr Labels benutzen, aber irgendwann wird das unsinnig...

Deshalb mach das, was meine Vorgänger schon gesagt haben: benutz eine JTable.

Ich hab dein Progi mal ein bisschen nachgeschrieben, das kann die vielleicht helfen in die JTable-Welt einzuseiten.

forum_039.png


Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class Test extends JFrame {
	public static void main( String[] args ){
		new Test().setVisible( true );
	}
	
    public Test(){
    	Model model = new Model();
    	JTable table = new JTable();
    	
    	table.setDefaultRenderer( Object.class, new Renderer() );
    	table.setDefaultEditor( Object.class, new Editor() );
    	
    	table.setModel( model );
    	
    	getContentPane().add( new JScrollPane( table ));
    	setBounds( 50, 50, 500, 500 );
    	setDefaultCloseOperation( EXIT_ON_CLOSE );
    }

    /**
     * Das Model beschreibt die Werte der Tabelle
     */
    private class Model extends AbstractTableModel{
    	private Object[] rows;
    	
    	public Model(){
    		rows = new Object[]{
   				new TitleRow( "Drinks without alcohol" ),
   				new EmptyRow(),
   				new TitleRow( "Cool" ),
   				new NormalRow( 14, "Coca Cola", "2.10", 0 ),
				new NormalRow( 15, "Orange Juice", "2.50", 0 ),
				new NormalRow( 16, "Bitter Lemon", "2.50", 0 ),
				new NormalRow( 17, "Tonic Water", "2.50", 0 ),
				new EmptyRow(),
				new TitleRow( "Hot" ),
				new NormalRow( 18, "Coffe black", "2.20", 0 ),
				new NormalRow( 19, "Coffee white", "2.20", 0 ),
				new NormalRow( 20, "Espresso", "2.50", 0 ),
				new NormalRow( 21, "Cappuccino", "2.70", 0 ),
				new EmptyRow(),
				new TitleRow( "Alcoholic" ),
   				new NormalRow( 22, "Johnny Walkter", "3.60", 0 ),
				new NormalRow( 23, "wheat beer", "3.50", 0 )
    		};
    	}

    	public int getRowCount() {
    		return rows.length;
    	}

    	public int getColumnCount() {
    		return 5;
    	}

    	public Object getValueAt( int rowIndex, int columnIndex ) {
    		return rows[ rowIndex ];
    	}
		
    	public void setValueAt( Object aValue, int rowIndex, int columnIndex ) {
    		NormalRow row = (NormalRow)rows[ rowIndex ];
    		row.number = ((Integer)aValue).intValue();
		
    		super.fireTableCellUpdated( rowIndex, 3 );
    		super.fireTableCellUpdated( rowIndex, 4 );
    	}
		
    	public String getColumnName( int column ) {
    		switch( column ){
				case 0: return "Tisch";
				case 1: return "Name";
				case 2: return "Preis";
				case 3: return "Anzahl";
				case 4: return "";
				default: throw new IllegalArgumentException();
    		}
    	}
		
    	public boolean isCellEditable( int row, int column ) {
    		return (column == 3 || column == 4) && rows[row] instanceof NormalRow;
    	}
    }
    
    private class NormalRow{
    	public int index;
    	public String name;
    	public String prize;
    	public int number;
    	
		public NormalRow(int index, String name, String prize, int number){
			this.index = index;
			this.name = name;
			this.prize = prize;
			this.number = number;
		}
    }
    
    private class TitleRow{
    	public String title;
    	
		public TitleRow(String title){
			this.title = title;
		}
    }
    
    private class EmptyRow{
    }
   
    /**
     * Der Renderer zeigt Werte der Tabelle an
     */
    private class Renderer implements TableCellRenderer{
    	private JButton button = new JButton();
    	private JLabel label = new JLabel();
    	private JTextField field = new JTextField();
    	
   	 	public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) {
   	 		if( value instanceof EmptyRow ){
   	 			label.setText( "" );
   	 			label.setBackground( table.getBackground() );
   	 			label.setForeground( table.getForeground() );
   	 			return label;
   	 		}
   	 		if( value instanceof TitleRow ){
   	 			if( column == 1 ){
   	 				Font font = table.getFont();
   	 				font = new Font( font.getName(), Font.BOLD, 16 );
   	 				label.setFont( font );
   	 			
   	   	 			label.setText( ((TitleRow)value).title );
   	   	 			label.setBackground( table.getBackground() );
   	   	 			label.setForeground( table.getForeground() );
   	   	 			return label;
   	 			}
   	 			else{
   	   	 			label.setText( "" );
   	   	 			label.setBackground( table.getBackground() );
   	   	 			label.setForeground( table.getForeground() );
   	   	 			return label;   	 				
   	 			}
   	 		}
   	 		else{
   	 			NormalRow nrow = (NormalRow)value;
   	 			
   	 			if( column == 0 ){
   	 				label.setFont( table.getFont() );
   	 				label.setText( String.valueOf( nrow.index ));
   	   	 			label.setBackground( table.getBackground() );
   	   	 			label.setForeground( table.getForeground() );
   	   	 			return label;
   	 			}
   	 			else if( column == 1 ){
   	 				label.setText( nrow.name );
   	 				label.setFont( table.getFont() );
   	   	 			label.setBackground( table.getBackground() );
   	   	 			label.setForeground( table.getForeground() );
   	   	 			return label;   	 				
   	 			}
   	 			else if( column == 2 ){
   	 				label.setText( nrow.prize );
   	 				label.setFont( table.getFont() );
   	   	 			label.setBackground( table.getBackground() );
   	   	 			label.setForeground( table.getForeground() );
   	   	 			return label;
	 			}
   	 			else if( column == 3 ){
   	 				field.setText( String.valueOf( nrow.number ));
   	 				field.setFont( table.getFont() );
   	   	 			field.setBackground( table.getBackground() );
   	   	 			field.setForeground( table.getForeground() );
   	   	 			return field;
   	 			}
   	 			else{
   	 				button.setText( String.valueOf( nrow.number ));
   	   	 			return button;   	 				
   	 			}
   	 		}
		}
    }
   
    /**
     * Der Editor verändert Werte der Tabelle
     */
    private class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener, DocumentListener{
    	private JButton button = new JButton();
    	private JTextField field = new JTextField();
    	private JTable table;
    	private int value;
    	
    	private int column = -1;
    	
    	public Editor(){
    		button.addActionListener( this );
    		field.getDocument().addDocumentListener( this );
    	}
    	
    	public void actionPerformed( ActionEvent e ){
    		value++;
    		stopCellEditing();
    	}
    	
		public Component getTableCellEditorComponent( JTable table,
				Object value, boolean isSelected, int row, int column ) {
		
			this.table = table;
			this.column = column;
			NormalRow nrow = (NormalRow)value;
			
			if( column == 3 ){
				field.setText( String.valueOf( nrow.number ) );
				this.value = nrow.number;
				return field;
			}
			else{
				button.setText( String.valueOf( nrow.number ) );
				this.value = nrow.number;
				return button;
			}
		}

		public boolean isCellEditable( EventObject e ) {
			return true;
		}
		
		public Object getCellEditorValue() {
			return Integer.valueOf( value );
		}

		private void updateField(){
			try{
				value = Integer.parseInt( field.getText() );
				field.setBackground( table.getBackground() );
			}
			catch( NumberFormatException ex ){
				field.setBackground( Color.RED );
			}
		}
		
		public void insertUpdate( DocumentEvent e ) {
			updateField();
		}

		public void removeUpdate( DocumentEvent e ) {
			updateField();
		}

		public void changedUpdate( DocumentEvent e ) {
			updateField();
		}
    }
}
 
D

dociman

Gast
..toll.. :applaus: wenn es nicht zu aufendig für dich ist ..eine Erläuterung würde mir weiterhelfen..

danke

.. ich habe es mal kopiert, doch die methode
Code:
public Object getCellEditorValue() { 
         return Integer.valueOf(value); 
      }

funktioniert nicht ?..er erwartet glaub ich einen String bei value ? lieg ich da richtig?
 
B

Beni

Gast
Als Erläuterung würde ich das hier vorschlagen. Das da oben ist grundsätzlich dasselbe...

Und bei mir funktioniert das (Integer.valueOf erwartet übrigens ein int, wie in der API steht :wink: ), hast du wirklich 1:1 kopiert?

[Edit: und lad dir mal das Java 1.5 runter, denn die Methode gibts erst ab 1.5 :wink:]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Abstand zwischen AnchorPane und Labels in dem HBox halten AWT, Swing, JavaFX & SWT 1
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
S Labels abfragen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
K Swing labels anpassen AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
X Swing Per Button die Labels und Textfelder auslesen AWT, Swing, JavaFX & SWT 8
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Buttons/Labels auf GUI positionieren AWT, Swing, JavaFX & SWT 2
X Swing setContentPane verdeckt mir alle Buttons Labels etc... AWT, Swing, JavaFX & SWT 14
D Wie kann ich Buttons und Labels besser anordnen AWT, Swing, JavaFX & SWT 4
V JTabbedPane Eingefügte Labels verschoben AWT, Swing, JavaFX & SWT 2
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
K Hilfe bei Labels AWT, Swing, JavaFX & SWT 3
K richtiges Ausrichten mehrerer Labels AWT, Swing, JavaFX & SWT 3
R Größe eines Labels bei GridBagLayout festlegen AWT, Swing, JavaFX & SWT 9
alex_fairytail LayoutManager NullLayout überlappende Labels werden nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Swing Positionierung eines Labels in einem Panel AWT, Swing, JavaFX & SWT 2
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
A Swing JFrame vergrößert sich immer bei setText() eines Labels AWT, Swing, JavaFX & SWT 3
D LayoutManager GridLayout, 2 labels nebeneinander AWT, Swing, JavaFX & SWT 8
B bin am verzweifeln, will auf knopfdruck durch ne überprüfung die labels unsichtbar machen AWT, Swing, JavaFX & SWT 2
K Swing Labels & Buttons auf Frame AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
M AWT TextFelder und Labels nicht ausgerichtet AWT, Swing, JavaFX & SWT 6
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
N Formular mit GridBaglayout und Abstände von Labels AWT, Swing, JavaFX & SWT 2
M Labels in ScrollPane mit Linie verbinden AWT, Swing, JavaFX & SWT 2
P SWT Composite und viele Labels AWT, Swing, JavaFX & SWT 10
G Frage zu Labels mit html AWT, Swing, JavaFX & SWT 3
S Labels und Button übereinander --> Reihenfolge? AWT, Swing, JavaFX & SWT 4
G Text eines Labels verändern? AWT, Swing, JavaFX & SWT 4
G Button vor Labels? AWT, Swing, JavaFX & SWT 5
H Labels mit setter-Methode modifizieren AWT, Swing, JavaFX & SWT 9
T Warum nehmen diese Labels die Hintergrundfarbe nicht an? AWT, Swing, JavaFX & SWT 6
T Labels gleichzeitig bewegen und anklicken AWT, Swing, JavaFX & SWT 3
S Position von Labels, Buttons, etc. festsetzen und Scrollen AWT, Swing, JavaFX & SWT 4
A Zeichnen auf zwei Labels. Geht nit AWT, Swing, JavaFX & SWT 7
D Zurücksetzen des Labels funtioniert nicht AWT, Swing, JavaFX & SWT 6
Landei Labels in Box linksbündig ausrichten AWT, Swing, JavaFX & SWT 15
P Hintergrund eines Labels/Panels setzen AWT, Swing, JavaFX & SWT 3
G der sinn von labels/jlabels ? AWT, Swing, JavaFX & SWT 3
L Labels verschwinden! AWT, Swing, JavaFX & SWT 10
T Labels verschieben / Flackern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben