Anderen Layout-Manager verwenden

Bonsai

Bekanntes Mitglied
Hallo Community,

ich habe mich mal an einer GUI versucht, seit langer zeit mal wieder. Ich bin damit auch soweit zufrieden, allerdings hätte ich folgende Probleme die mich noch stören daran. Aber hier erst mal der Code:
Java:
public JCoatView(){
		JFrame jcoatframe = new JFrame("JCoat");
		JTabbedPane jcoattabbed = new JTabbedPane();
		JTable jcoattable;
		JButton laden = new JButton("Datei laden");
		//String numb;
		//ImageIcon im = null;
		int i = 0;
				
		String spalte[] = {"", "#", "Type", "Description", "Resource", "Line", "Number", "Package"};
		Object results[][]= new Object[][]{};
		DefaultTableModel table = new DefaultTableModel(results, spalte);
		
		jcoatframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jcoatframe.setSize(600, 400);
		jcoattable = new JTable(table);
		jcoattabbed.addTab("Results", new JScrollPane(jcoattable));
		TableColumn column = jcoattable.getColumnModel().getColumn(0); 
		column.setPreferredWidth(8);
		column = jcoattable.getColumnModel().getColumn(1);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(2);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(3);
		column.setPreferredWidth(150);
		column = jcoattable.getColumnModel().getColumn(5);
		column.setPreferredWidth(5);
		column = jcoattable.getColumnModel().getColumn(6);
		column.setPreferredWidth(5);
		//jcoattabbed.add(new JScrollPane(jcoattable));
		
		laden.addActionListener(new ButtonListener());
		laden.setPreferredSize(new Dimension(100,25));
		jcoatframe.add(laden, BorderLayout.SOUTH);
		
		jcoattabbed.addTab("UPOP", new JTextArea(""));

		jcoatframe.add(jcoattabbed);
		jcoattabbed.setVisible(true);
		jcoatframe.setVisible(true);
		
		
	}
}

ich hätte bei dieser GUI allerdings gern, dass zum einen der Button in dem Tab "Results", am besten unten rechts integriert wird. Die idealste Lösung dafür wäre sicherlich ein Layout Manager, da ja auf diesem Tab auch noch die Tabelle liegt. Allerdings weiß ich noch nicht wie ich da ran gehen soll. Würde mich über hilfe sehr freuen.

Gruß
Bonsai
 
Hab schon lange nicht mehr mit Swing gearbeitet, aber es sollte möglich sein ein JPanel zu erzeugen (mit einem Layout - je nachdem welches du haben willst) und diesem JPanel als Kinder den Button und den JTable (bzw. JScrollPane mit JTable) zu übergeben.
Und dieses erzeugte Panel dann als Tab einfügen

Java:
        jcoatpanel = new JPanel(..);
          weiterer Code
        jcoattabbed.addTab("Results", jcoatpanel);
 
Wenn ich das mit dem Panel mach, was schon mal soweit funktioniert, dann ist allerdings kein Scrollbalken mehr da. Ich hab das wie folgt geändert:
Java:
jcoattable = new JTable(table);
		
		jcoattabbed.addTab("Results", jcoatpanel/*new JScrollPane(jcoattable)*/);
		TableColumn column = jcoattable.getColumnModel().getColumn(0); 
		column.setPreferredWidth(8);
		column = jcoattable.getColumnModel().getColumn(1);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(2);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(3);
		column.setPreferredWidth(150);
		column = jcoattable.getColumnModel().getColumn(5);
		column.setPreferredWidth(5);
		column = jcoattable.getColumnModel().getColumn(6);
		column.setPreferredWidth(5);
		//jcoattabbed.add(new JScrollPane(jcoattable));
		
		jcoatpanel.add(new JScrollPane(jcoattable));
		jcoatpanel.add(laden);
		
		laden.addActionListener(new ButtonListener());
		//laden.setPreferredSize(new Dimension(100,25));
		//jcoatframe.add(laden, BorderLayout.SOUTH);
		
		jcoattabbed.addTab("UPOP", new JTextArea(""));

		jcoatframe.add(jcoattabbed);
		jcoattabbed.setVisible(true);
		jcoatframe.setVisible(true);
		
		
	}
}

Außerdem müsst ich dann noch das Layout ein wenig ändern, dass der Tabellenausschnitt nicht bis ganz unten an das Panel geht, und somit eine Art Freiraum für den Button unterhalb der Tabelle ist
 
Deinen Button bekommst du so auf die rechte Seite:

Java:
    public JCoatView(){
        JFrame jcoatframe = new JFrame("JCoat");
        JTabbedPane jcoattabbed = new JTabbedPane();
        JTable jcoattable;
        JButton laden = new JButton("Datei laden");
        //String numb;
        //ImageIcon im = null;
        int i = 0;

        String spalte[] = {"", "#", "Type", "Description", "Resource", "Line", "Number", "Package"};
        Object results[][]= new Object[][]{};
        DefaultTableModel table = new DefaultTableModel(results, spalte);

        jcoatframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jcoatframe.setSize(600, 400);
        jcoattable = new JTable(table);
        jcoattabbed.addTab("Results", new JScrollPane(jcoattable));
        TableColumn column = jcoattable.getColumnModel().getColumn(0);
        column.setPreferredWidth(8);
        column = jcoattable.getColumnModel().getColumn(1);
        column.setPreferredWidth(10);
        column = jcoattable.getColumnModel().getColumn(2);
        column.setPreferredWidth(10);
        column = jcoattable.getColumnModel().getColumn(3);
        column.setPreferredWidth(150);
        column = jcoattable.getColumnModel().getColumn(5);
        column.setPreferredWidth(5);
        column = jcoattable.getColumnModel().getColumn(6);
        column.setPreferredWidth(5);
        //jcoattabbed.add(new JScrollPane(jcoattable));

        laden.addActionListener(new ButtonListener());
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(laden);
        jcoatframe.add(buttonPanel, BorderLayout.SOUTH);

        jcoattabbed.addTab("UPOP", new JTextArea(""));

        jcoatframe.add(jcoattabbed);
        jcoattabbed.setVisible(true);
        jcoatframe.setVisible(true);
    }

Sieht dann so aus:
 
Um einen Button rechtsbündig anzuzeigen hilft dir das FlowLayout:
Java:
JPanel buttonPanel=new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING);
buttonPanel.add(button);
Damit der Table über dem Button ist, musst du das ganze wieder in ein Panel packen, diesmal BorderLayout. Der Table (mit scrollPane) ins Center, das buttonPanel in South.
 
ich hab das so wie ihr sagt gemacht, rein an der GUI hat sich aber rein gar nix verändert

Java:
jcoatpanel.add(new JScrollPane(jcoattable), BorderLayout.CENTER);
		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(laden);
        jcoatpanel.add(buttonPanel, BorderLayout.SOUTH);
 
ohne mal die Antworten gelesen zu haben, die sicherlich gleiches, oder ähnliches empfehlen...hier ein Möglichkeit, den Button unten rechts in dem Tab Results anzuzeigen.

Die Namen für die Panels sollten natürlich noch umbenannt werden.

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class JCoatView {
	public JCoatView() {
		JFrame jcoatframe = new JFrame("JCoat");
		JTabbedPane jcoattabbed = new JTabbedPane();
		JTable jcoattable;
		JButton laden = new JButton("Datei laden");
		// String numb;
		// ImageIcon im = null;
		int i = 0;

		String spalte[] = { "", "#", "Type", "Description", "Resource", "Line",
				"Number", "Package" };
		Object results[][] = new Object[][] {};
		DefaultTableModel table = new DefaultTableModel(results, spalte);

		jcoatframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jcoatframe.setSize(600, 400);
		jcoattable = new JTable(table);

		JPanel panel1 = new JPanel(new BorderLayout());
		panel1.add(new JScrollPane(jcoattable), BorderLayout.CENTER);
		JPanel panel2 = new JPanel(new BorderLayout());
		panel2.add(laden, BorderLayout.EAST);
		panel1.add(panel2, BorderLayout.SOUTH);

		jcoattabbed.addTab("Results", new JScrollPane(panel1));
		TableColumn column = jcoattable.getColumnModel().getColumn(0);
		column.setPreferredWidth(8);
		column = jcoattable.getColumnModel().getColumn(1);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(2);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(3);
		column.setPreferredWidth(150);
		column = jcoattable.getColumnModel().getColumn(5);
		column.setPreferredWidth(5);
		column = jcoattable.getColumnModel().getColumn(6);
		column.setPreferredWidth(5);
		// jcoattabbed.add(new JScrollPane(jcoattable));

		// laden.addActionListener(new ButtonListener());
		laden.setPreferredSize(new Dimension(100, 25));
		// jcoatframe.add(laden, BorderLayout.SOUTH);

		jcoattabbed.addTab("UPOP", new JTextArea(""));

		jcoatframe.add(jcoattabbed);
		jcoattabbed.setVisible(true);
		jcoatframe.setVisible(true);

	}

	public static void main(String[] args) {
		new JCoatView();
	}
}
 
Ich habe jetzt noch eine JTextArea neben den Button Platziert. Wenn ich den Button drück, öffnet sich ein JFileChooser. Nun würde ich gern Namen der ausgewählten Datei in die TextArea bekommen. dazu müsst ich ja irgendwie den Wert an die TextAre übergeben und die GUI aktualisieren. Da der FilChooser erst nach der GUI ausgeführt wird. das Übergeben des Filenamens von der Klasse wo der FileChooser drin ist an die Klasse wo die eigentliche GUI drin ist, ist ja kein problem. Aber wie bekomm ich das jetzt da noch angezeigt?
 
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class JCoatView {
	public JCoatView() {
		final JFrame jcoatframe = new JFrame("JCoat");
		JTabbedPane jcoattabbed = new JTabbedPane();
		JTable jcoattable;
		JButton laden = new JButton("Datei laden");
		final JTextField jtf = new JTextField();
		// String numb;
		// ImageIcon im = null;
		laden.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				JFileChooser jfc = new JFileChooser();

				int returnValue = jfc.showDialog(jcoatframe, "OK, ");
				if (returnValue == JFileChooser.APPROVE_OPTION) {
					try {
						jtf.setText(jfc.getSelectedFile().getCanonicalPath());
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}
			}
		});
		int i = 0;

		String spalte[] = { "", "#", "Type", "Description", "Resource", "Line",
				"Number", "Package" };
		Object results[][] = new Object[][] {};
		DefaultTableModel table = new DefaultTableModel(results, spalte);

		jcoatframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jcoatframe.setSize(600, 400);
		jcoatframe.setLocationRelativeTo(null);
		jcoattable = new JTable(table);

		JPanel panel1 = new JPanel(new BorderLayout());
		panel1.add(new JScrollPane(jcoattable), BorderLayout.CENTER);
		JPanel panel2 = new JPanel(new BorderLayout());
		panel2.add(laden, BorderLayout.EAST);
		panel2.add(jtf, BorderLayout.CENTER);
		panel1.add(panel2, BorderLayout.SOUTH);

		jcoattabbed.addTab("Results", new JScrollPane(panel1));
		TableColumn column = jcoattable.getColumnModel().getColumn(0);
		column.setPreferredWidth(8);
		column = jcoattable.getColumnModel().getColumn(1);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(2);
		column.setPreferredWidth(10);
		column = jcoattable.getColumnModel().getColumn(3);
		column.setPreferredWidth(150);
		column = jcoattable.getColumnModel().getColumn(5);
		column.setPreferredWidth(5);
		column = jcoattable.getColumnModel().getColumn(6);
		column.setPreferredWidth(5);
		// jcoattabbed.add(new JScrollPane(jcoattable));

		// laden.addActionListener(new ButtonListener());
		laden.setPreferredSize(new Dimension(100, 25));
		// jcoatframe.add(laden, BorderLayout.SOUTH);

		jcoattabbed.addTab("UPOP", new JTextArea(""));

		jcoatframe.add(jcoattabbed);
		jcoattabbed.setVisible(true);
		jcoatframe.setVisible(true);

	}

	public static void main(String[] args) {
		new JCoatView();
	}
}

[edit]
gleiches gilt für eine Textarea, bzw. eine JTextArea. Die bietet eine Methode
Code:
setText(String s)
mit der du dann den/das File anzeigen kannst.
Da deine ActionListener in einer anderen Klasse ausgelagert sind, könnte man diese Klasse als Übergabeparameter für den ActionListener implementieren. Dafür musst du aber die entsprechenden Variablen auch als Klassenvariablen definieren und nicht alles im Konstruktor machen....[/edit]
 
Zuletzt bearbeitet:
In deiner Variante wird ja der FileChooser in der ActionListener Methode aufgerufen, aber ich hab ja schon ne Klasse die das macht
 
in der Variante die du mir gegeben hast, klappt das soweit, allerdings wird halt der absolute pfad angegeben, was ich dann schon irgendwie hinbekomm. allerdings bekomm ich deins nicht so umformuliert, dass ich dass in meine schon vorhandene klasse ButtonListener bekomme...😳
 
Zuletzt bearbeitet:
zur Zeit sieht der Listener für den Button noch so aus:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JFileChooser;

public class ButtonListener implements ActionListener {

	JCReader reader = new JCReader();
	JCoatView view;
	ButtonListener() {
	  }

	  public void actionPerformed(ActionEvent e) {
	    if (e.getActionCommand().equals("Datei laden")) {
	      try {
			reader.DateiHoler();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	    }
	    
	  

}}

Und der eigentliche FileChoose aufruf findet dann in der Klasse JCReader statt.
 
warum einfach, wenn es auch kompliziert geht 😀

Java:
public class JCoatView {
	JTextField jtf = new JTextField();

	public JTextField getJtf() {
		return jtf;
	}
public JCoatView() {
		final JFrame jcoatframe = new JFrame("JCoat");
//... usw

[java=79] laden.addActionListener(new ButtonListener(this));[/code]

Java:
class ButtonListener implements ActionListener {

	JCReader reader = new JCReader();
	JCoatView view;

	ButtonListener(JCoatView jcv) {
		this.view = jcv;
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Datei laden")) {
			try {
				reader.DateiHoler();
				jcv.getJTextField().setText(
						reader.wieAuchImmerDieMethodeHeisst());
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				// e1.printStackTrace();
			}
		}

	}
}
 

Neue Themen


Zurück
Oben