Zum Inhalt springen

Probleme bei Control Positionierung bei zu kleiner Auflösung


Gateway_man

Empfohlene Beiträge

Guten Abend,

Vorab ich arbeite mit Swing, jedoch immer ohne LayoutManager (komm damit nicht klar).

folgendes Problem besteht.

Ich habe eine Maske (siehe Anhang) welche aus mehreren Panels besteht.

Links ist das hauptmenü. Dieses hällt einige JToogleButtons inne.

Rechts sind die Suchkritieren zu dem jeweiligen Menüpunkt.

Jetzt habe ich das Problem das die Textboxen im rechten Menü bei einer Auflösung unter 1280x1024 mit dem unter diesem liegenden Buttons kollidieren.

Nun wollte ich frage ob es sowas wie ein Spezielles Panel gibt, welches über scollbars verfügt. Dann könnte ich die Textboxen darin platzieren.

Ich hab es bereits mit dem ScrollPane auspropiert, jedoch scheint es dafür nicht konzipiert worden zu sein.

Mit dem standart JPanel hatte ich es ebenso versucht, indem ich diesem Scrollbars hinzufügte jedoch sind diese dafür ebenso wenig konzipiert, da es keine möglichkeit hab diese darin anzusteuern/konfigurieren.

Andere Möglichkeiten sind natürlich auch gerne gesehn.

lg

Gateway

post-47975-14430448894274_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du es wirklich mit einer ScrollPane probiert, oder ist dir beim schreiben nur das J entfallen?

Wenn es wirklich eine ScrollPane war, probier es mal mit der JScrollPane.

Falls du aber diese schon probierst hast, wäre es gut zu wissen wie du die Positionierung deiner Textfields und Buttons vorgenommen hast, damit man das nachtesten kann.

Wenn ich nämlich die rechte Spalte deiner GUI nachbilde, funktioniert das bei mir mit der JScrollPane einwandfrei. Da ich bei mir, aufgrund der gesparten Schreibarbeit, natürlich LayoutManager benutzt habe, weiß ich aber nicht, ob es vielleicht daran liegen könnte, dass es bei dir nicht funktioniert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Morgen,

ja sry es war ein JScrollPane.

Das Problem war das ich bei diesem Control nicht ohne dem LayoutManager arbeiten kann. Er wirft mir immer einen Fehler wenn ich diesen auf null setzten will.

Hier ist der Codeausschnitt für das rechten Menü so wie man es oben im screenshot sehen kann:


public class FrmMain extends JFrame

{

        public JPanel pnlUser;

        public JTable dgvUser;

        public JScrollPane scpUser;

        public JPanel pnlUsOptio;

        public TblModel usModel;

        public JButton btnUsRefresh;

        public JButton btnUsSearch;

        public JButton btnUsChange;

        public JButton btnUsDelete;

        public JButton btnUsCreate;

        public JLabel lblUsID = new JLabel("User ID:");

        public JTextField txtUsID = new JTextField();

        public JLabel lblUsGroup = new JLabel("User Gruppe:");

        public JComboBox cmbUsGroup = new JComboBox();

        public JLabel lblUsPrio = new JLabel("User Priorität:");

        public JComboBox cmbUsPrio = new JComboBox();

        public JLabel lblUsName = new JLabel("Name:");

        public JTextField txtUsName = new JTextField();

        public JLabel lblUsVorname = new JLabel("Vorname:");

        public JTextField txtUsVorname = new JTextField();

        public JLabel lblUsStr = new JLabel("Strasse:");

        public JTextField txtUsStr = new JTextField();

        public JLabel lblUsHNummer = new JLabel("Hausnummer:");

        public JTextField txtUsHNummer = new JTextField();

        public JLabel lblUsPLZ = new JLabel("PLZ:");

        public JTextField txtUsPLZ = new JTextField();

        public JLabel lblUsOrt = new JLabel("Ort:");

        public JTextField txtUsOrt = new JTextField();

        public JLabel lblUsTelefon = new JLabel("Telefon:");

        public JTextField txtUsTelefon = new JTextField();

        public JLabel lblUsMail = new JLabel("E-Mail:");

        public JTextField txtUsMail = new JTextField();


//In nachfolgender Methode werden diverese Properties des Forms gesetzt.

    	private void ContainerSetup(){

    	GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

    	this.setTitle("sample");

            	this.setSize(ge.getMaximumWindowBounds().width, ge.getMaximumWindowBounds().height);

    	this.setLocation(0,0);

    	this.setLayout(null);

    	this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    	this.setEnabled(false);

    	this.setResizable(false);

    	}



private void initComponents() {

        pnlUser = new JPanel(null);

        pnlUser.setVisible(false);

        pnlUser.setBorder(new javax.swing.border.LineBorder(Color.lightGray, 2, true));

        pnlUser.setBackground(Color.WHITE);

        pnlUser.setLocation(sideMenu.getLocation().x + sideMenu.getWidth() + 1,

                            menuBar.getLocation().y + menuBar.getSize().height + 1); //Bitte beachte das du statt des sideMenu's & menuBar's eine feste größe angiebst da dieses in dem snippet nicht definiert ist.

        pnlUser.setSize(this.getSize().width - sideMenu.getSize().width - 10,

                        this.getSize().height - 25 - menuBar.getSize().height - statusPanel.getSize().height); //Bitte beachte das du statt des sideMenu's & menuBar's eine feste größe angiebst da dieses in dem snippet nicht definiert ist.


        //FillUserPanel

        usModel = new TblModel();

        dgvUser = new JTable(usModel);

        dgvUser.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        dgvUser.setAutoscrolls(true);

        dgvUser.setBackground(Color.WHITE);

        dgvUser.setGridColor(Color.BLACK);

        dgvUser.setForeground(Color.BLACK);

        dgvUser.setSize((int)(pnlUser.getVisibleRect().width * (0.8)),pnlUser.getVisibleRect().height);

        dgvUser.setLocation(0,0);

        usModel.addColumn("UserID");

        usModel.addColumn("UserGroup");

        usModel.addColumn("UserPrio");

        usModel.addColumn("Username");

        usModel.addColumn("Passwort");

        usModel.addColumn("Name");

        usModel.addColumn("Vorname");

        usModel.addColumn("Strasse");

        usModel.addColumn("Hausnummer");

        usModel.addColumn("PLZ");

        usModel.addColumn("Ort");

        usModel.addColumn("Telefon");

        usModel.addColumn("E-Mail");

        usModel.addColumn("Speicher Datum");

        for (int i = 0;i<=dgvUser.getColumnModel().getColumnCount()- 1;i++){

        dgvUser.getColumnModel().getColumn(i).setPreferredWidth((int)(dgvUser.getVisibleRect().width / dgvUser.getColumnModel().getColumnCount()));

        }

        dgvUser.setLayout(null);

        dgvUser.setRowSelectionAllowed(true);

        dgvUser.setCellEditor(null);

        dgvUser.setSelectionMode(NORMAL);

        scpUser = new JScrollPane(dgvUser);

        scpUser.setSize((int)(pnlUser.getVisibleRect().width * (0.8)),pnlUser.getVisibleRect().height);

        scpUser.setLocation(0,0);

        pnlUser.add(scpUser);

        //

       //Create&Fill pnlUsOptio

            pnlUsOptio = new JPanel(null);

            pnlUsOptio.setBorder(new javax.swing.border.LineBorder(Color.lightGray, 2, true));

            pnlUsOptio.setSize(pnlUser.getVisibleRect().width - dgvUser.getSize().width - 2,

            		pnlUser.getVisibleRect().height - 4);

            pnlUsOptio.setLocation(dgvUser.getSize().width + 2, 0);

            pnlUsOptio.setBackground(Color.WHITE);

            pnlUser.add(pnlUsOptio);


            btnUsRefresh = new JButton("Aktualisieren");

            btnUsRefresh.setSize(pnlUsOptio.getVisibleRect().width - 4, 30);

            btnUsRefresh.setLocation(2, pnlUsOptio.getVisibleRect().height - 30);

            pnlUsOptio.add(btnUsRefresh);

            btnUsSearch = new JButton("Suchen");

            btnUsSearch.setSize(pnlUsOptio.getVisibleRect().width - 4, 30);

            btnUsSearch.setLocation(2, pnlUsOptio.getVisibleRect().height - 61);

            pnlUsOptio.add(btnUsSearch);

            btnUsChange = new JButton("User bearbeiten");

            btnUsChange.setSize(pnlUsOptio.getVisibleRect().width - 4, 30);

            btnUsChange.setLocation(2, pnlUsOptio.getVisibleRect().height - 92);

            pnlUsOptio.add(btnUsChange);

            btnUsDelete = new JButton("User löschen");

            btnUsDelete.setSize(pnlUsOptio.getVisibleRect().width - 4, 30);

            btnUsDelete.setLocation(2, pnlUsOptio.getVisibleRect().height - 123);

            pnlUsOptio.add(btnUsDelete);

            btnUsCreate = new JButton("User erstellen");

            btnUsCreate.setSize(pnlUsOptio.getVisibleRect().width - 4, 30);

            btnUsCreate.setLocation(2, pnlUsOptio.getVisibleRect().height - 154);

            pnlUsOptio.add(btnUsCreate);

            lblUsID.setLocation(5,5);

            txtUsID.setLocation(5,30);

            lblUsGroup.setLocation(5,55);

            cmbUsGroup.setLocation(5, 80);

            lblUsPrio.setLocation(5, 105);

            cmbUsPrio.setLocation(5, 130);

            lblUsName.setLocation(5, 155);

            txtUsName.setLocation(5, 180);

            lblUsVorname.setLocation(5, 205);

            txtUsVorname.setLocation(5, 230);

            lblUsStr.setLocation(5, 255);

            txtUsStr.setLocation(5,280);

            lblUsHNummer.setLocation(5, 305);

            txtUsHNummer.setLocation(5,330);

            lblUsPLZ.setLocation(5, 355);

            txtUsPLZ.setLocation(5,380);

            lblUsOrt.setLocation(5, 405);

            txtUsOrt.setLocation(5,430);

            lblUsTelefon.setLocation(5, 455);

            txtUsTelefon.setLocation(5,480);

            lblUsMail.setLocation(5,505);

            txtUsMail.setLocation(5,530);

            lblUsID.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsID.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsGroup.setSize(pnlUsOptio.getWidth() - 10, 20);

            cmbUsGroup.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsPrio.setSize(pnlUsOptio.getWidth() - 10, 20);

            cmbUsPrio.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsName.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsName.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsVorname.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsVorname.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsStr.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsStr.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsHNummer.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsHNummer.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsPLZ.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsPLZ.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsOrt.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsOrt.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsTelefon.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsTelefon.setSize(pnlUsOptio.getWidth() - 10, 20);

            lblUsMail.setSize(pnlUsOptio.getWidth() - 10, 20);

            txtUsMail.setSize(pnlUsOptio.getWidth() - 10, 20);

            cmbUsGroup.addItem("");

            cmbUsGroup.addItem("None");

            cmbUsGroup.addItem("User");

            cmbUsGroup.addItem("Employee");

            cmbUsGroup.addItem("Adimin");

            cmbUsPrio.addItem("");

            cmbUsPrio.addItem("None");

            cmbUsPrio.addItem("Low");

            cmbUsPrio.addItem("Mid");

            cmbUsPrio.addItem("High");

            pnlUsOptio.add(lblUsID);

            pnlUsOptio.add(txtUsID);

            pnlUsOptio.add(lblUsGroup);

            pnlUsOptio.add(cmbUsGroup);

            pnlUsOptio.add(lblUsPrio);

            pnlUsOptio.add(cmbUsPrio);

            pnlUsOptio.add(lblUsName);

            pnlUsOptio.add(txtUsName);

            pnlUsOptio.add(lblUsVorname);

            pnlUsOptio.add(txtUsVorname);

            pnlUsOptio.add(lblUsStr);

            pnlUsOptio.add(txtUsStr);

            pnlUsOptio.add(lblUsHNummer);

            pnlUsOptio.add(txtUsHNummer);

            pnlUsOptio.add(lblUsPLZ);

            pnlUsOptio.add(txtUsPLZ);

            pnlUsOptio.add(lblUsOrt);

            pnlUsOptio.add(txtUsOrt);

            pnlUsOptio.add(lblUsTelefon);

            pnlUsOptio.add(txtUsTelefon);

            pnlUsOptio.add(lblUsMail);

            pnlUsOptio.add(txtUsMail);

            //

            this.add(pnlUser);

 	}


    	public class TblModel extends DefaultTableModel{

	@Override     

	public boolean isCellEditable(int row, int column) {  

		return false;   

	} 


}


}

Bin mir gerade nicht sicher ob ich da jetzt was vergessen habe, da das sehr viele controls sind und ich jetzt hier gerade die paar rauskopieren musste.

Vielen Dank für die Hilfe.

lg

Gateway

PS: Wie gesagt, der LayoutManager sollte bei möglichkeit nicht genutzt werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das Problem war mir auch noch nicht bekannt, da ich nie mit null-Layout arbeite, jedoch habe ich denke ich jetzt ne Lösung für dich:

In einem ScrollPane wird ein Panel mit einem null-Layout zwar angezeigt, jedoch fehlt der scroll-balken. ist ein layoutmanager gesetzt, so geht auch das scrollen.

das liegt daran, dass der layoutmanager von selbst die preferdsize setzt. das scrollpane fragt die preferedsize ab und erstellt anhand dieser den scrollbalken. im null-layout ist die prefered size jedoch nicht gesetzt und für das scrollpane somit (0,0), dass heißt es wird ein scroll-balken für ein objekt dieser größe angelegt und das ist in diesem fall keiner.

demnach einfach die preferedsize setzen:

panelMitNullLayout.setPreferredSize(new Dimension(500,800));

Zusätzlich dazu musst du auch noch deine Textfelder in ein anderes JPanel setzen als deine Buttons.

Das heißt dann, du nimmst ein JPanel für deine ganzen Textfelder + Labels. An diesem setzt du die PreferredSize, also die Größe die deine Textfelder + Labels mindestens brauchen. Das JPanel fügst du dann in eine JScrollPane ein und diese dann dem nächst höherem JPanel.

Deine Buttons kommen in ein anderen JPanell und das JPanel wird dann einfach wie normal in die untere rechte Ecke deines Fensters gesetzt.

Du wirst aber trotzdem nicht drumherum kommen der JScrollPane ihren LayoutManager zu lassen. Ohne diesen funktioniert eine JScrollPane einfach nicht.

Darf man eigentlich fragen warum du eine so große Abneigung gegen LayoutManager hast, dass du diese sogar versuchst aus Standardelementen zu entfernen?

Bearbeitet von Dragon8
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

danke dir allerdings habe ich bereits probiert ein Jpanel (Mit NullLayoutManager) in das JScrollPane zu legen. Dann habe ich die Textfelder und die Buttons reingelegt, jedoch zeigte mir das JScrollPane leider keine Scrollbars an. Scheinbar hat das JPanel sich nicht automatisch resized.

Ich werd mir mal den Artikel zu gemüte führen.

Vielen dank nochmals.

Darf man eigentlich fragen warum du eine so große Abneigung gegen LayoutManager hast, dass du diese sogar versuchst aus Standardelementen zu entfernen?

Ich arbeite nicht gerade freiwillig mit Java, da ich eher eine große Abneigung diesbezüglich habe. Und auf manche Dinge (die ich persönlich für unsinnig und umständlich erachte) lass ich mich noch ein (beispielsweise das registrieren von Events). Aber der LayoutManager ist für mich einfach ein NoGo. Ich bin es nunmal gewöhnt alles selbst festzulegen (sprich size,location,verhalten,ect.), das mag ich so und ich will es auch nicht anders. Zumal mir gesagt wurde das das Thema LayoutManager äußert umfangreich ist und ich für dieses Programm nicht mehr viel Zeit habe, entschied ich mich es so zu machen wie ich es immer mache und somit auf den LayoutManager zu verzichten. ;)

Wie man merkt bin ich ein recht sturer esel :D.

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

danke dir allerdings habe ich bereits probiert ein Jpanel (Mit NullLayoutManager) in das JScrollPane zu legen. Dann habe ich die Textfelder und die Buttons reingelegt, jedoch zeigte mir das JScrollPane leider keine Scrollbars an. Scheinbar hat das JPanel sich nicht automatisch resized.

Wie geschrieben, das ist erst der Anfang, danach musst du halt noch unbedingt die PreferredSize des JPanels setzen, da reicht es nicht nur die Size zu setzen. An deiner Stelle würde ich mir einfach ausrechnen wie viel Platz deine GUI Objekte minimal brauchen und diese dann als PreferredSize immer eintragen. Deine JScrollPane kannst du dann auf die tatsächliche Größe die zu Verfügung steht setzen. Wenn dann der verfügbare Platz größer ist, als der Platz den das JPanel braucht, wird das gesamte Panel angezeigt und die ScrollPane bleibt unsichtbar. Wenn die Größe nicht ausreicht, werden Scrollbalken angezeigt.

Dass du selber nicht mit LayoutManagern arbeiten willst, kann ich ja nach nachvollziehen, jedoch empfehle ich dir, die nicht zu versuchen bei allen Komponenten zu entfernen. Bei der JScrollPane gehört er zB zwingend dazu, damit diese überhaupt funktioniert. Aber auch die JTable ist so ein komplexes Gebilde, dass du von Glück reden kannst, dass die durch dein null-Layout nicht durcheinanger gekommen ist ;)

Falls du doch irgendwann wieder mit Java arbeiten musst und etwas mehr Zeit hast, würde ich dir aber wirklich empfehlen, dir das Thema LayoutManager einfach anzuschauen. Auch wenn man es gewöhnt ist, normalerweise alles anzugeben, kann einem der LayoutManager doch sehr viel unnötige Arbeit abnehmen.

Bevor du dich dann von den internen Java LayoutManager abschrecken lässt, schau dir zB mal das FormLayout (JGoodies :: Forms). Meiner Meinung nach einfacher zu handhaben und flexibler als die Standardmanager.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...