Avatar billede VC1 Seniormester
19. maj 2022 - 10:20 Der er 14 kommentarer

JButton skaber problemer og vil ikke vises korrekt

I min application har jeg en frame og fire paneler, hver side. Når jeg .add'er en JButton til min mainFrame fylder den det hele, uanset mine størrelsesindstillinger.

.add'er jeg til et JPanel, så kommer knappen bare i midten, igen uanset mine indstillinger.

Video der her viser mit problem.
https://www.youtube.com/watch?v=Y5IBMGP9kh0

Uanset hvordan jeg har tilføjet knappen, så vil den ikke rigtigt samarbejde, hvad kan der være galt?
Avatar billede arne_v Ekspert
19. maj 2022 - 16:37 #1
Hvilken layout manager bruger du på JFrame content pane og på de 4 JPanel?
Avatar billede arne_v Ekspert
19. maj 2022 - 16:40 #2
Nogle af de simple layouts er:

BorderLayout og add til North, West, Center, East, South

GridLayout(rows, cols) og add - hvor de så tilføjes row wise
Avatar billede arne_v Ekspert
19. maj 2022 - 16:41 #3
En anden praktisk ting er:

noget.setPreferredSize(new Dimension(width, height));

som sætter størrelsen eksplicit på f.eks. et JPanel.
Avatar billede VC1 Seniormester
19. maj 2022 - 19:49 #4
JFrame content panel?
- Jeg beklager, men jeg er ikke helt med på spørgsmålet.
- Her er alle de biblioteker osv jeg bruger.

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class GameUI extends JPanel implements MouseListener


Jeg bruger netop BorderLayout til mine 4 paneler, eksempel på et herunder.

        JPanel topPanel = new JPanel();
        topPanel.setBackground(Color.black);
        topPanel.setPreferredSize(new Dimension(100, 100));
        mainFrame.add(topPanel, BorderLayout.NORTH);

Problemer virker ikke til at være panelerne, men til gengæld lige så snart jeg vil have en Button tilføjet.
Avatar billede VC1 Seniormester
19. maj 2022 - 20:00 #5
For at se koden bedre har jeg uploaded den på GitHub.

https://github.com/Drafter47/Draft4Anything/blob/main/Pandemic/src/GameUI.java
Avatar billede arne_v Ekspert
19. maj 2022 - 20:13 #6
Du skal have et JPanel til dine JButton. Enten en af de 4 du har lavet - eller et nyt (CENTER).

Så sætter du en layout manager på det panel og add'er din JButton til det panel.
Avatar billede arne_v Ekspert
19. maj 2022 - 20:17 #7
Hvis du vil have but2 i topPanel, så laver du:

topPanel.add(but2);

til:

topPanel.setLayoutManager(new BorderLayout());
topPanel.add(but2, BorderLayout.CENTER);

eller:

topPanel.setLayoutManager(new GridLayout(1, 1));
topPanel.add(but2);
Avatar billede arne_v Ekspert
19. maj 2022 - 20:20 #8
Layout managers kan godt drive folk som skal igang med Swing til vanvid.

Men alle JPanel's skal have en layout manager hvis du add'er til dem.

Og content pane (det JPanel som en JFrame komemr med) bør også sættes eksplicit.

mainFrame.getContentPane().setLayoutManager(new BorderLayout());
Avatar billede VC1 Seniormester
19. maj 2022 - 20:23 #9
Okay, så jeg kan altså ikke bare smide den en x,y og dimension som jeg har gjort.

Jeg forstår stadig ikke det der layoutmanager, hvad skal jeg skrive istedet for
setLayoutManager, da jeg jo ikke har den defineret - da jeg ikke aner hvad den er udtryk for.
Avatar billede VC1 Seniormester
19. maj 2022 - 20:34 #10
Men mit helt store problem er netop at jeg vil bestemme præcis hvor mine Buttons skal være på min mainFrame, da de vil fungere som felter i mit spil.
Avatar billede arne_v Ekspert
19. maj 2022 - 20:49 #11
Der er flere muligeheder for at placere ting.

En mulighed er at lave et GridLayout med 20x20 og så tilføje 400 komponenter: enten en JLabel (eventuel tom!) eller en JButton.

De vil blive vist som en 20 x 20 matrix.

En anden mulighed er direkte paint.
Avatar billede arne_v Ekspert
19. maj 2022 - 20:52 #12
En layout manager er noget kode som styrer hvordan komponenter som tlføjes til et panel placeres.

Sætter du en BorderLayout manager så bruger du:

ditpanel.add(komponent, BorderLayout.NORTH);
...
ditpanel.add(komponent, BorderLayout.SOUTH);

sætter du en GridLayout med f.eks. 3 x 3 så laver du 9 adds:

ditpanel.add(komponent);

og de indsættes i en 3 x 3 matrix som:

1 2 3
4 5 6
7 8 9
Avatar billede VC1 Seniormester
19. maj 2022 - 21:12 #13
Modtaget, det må jeg lige kigge/læse lidt mere om (gridlayout), det er måske derfor knappen har fyldt hele frame, da denne ikke er blevet defineret tidligere.

Du siger man kan gøre det i paint? Har du en funktion jeg kan læse på til det, har lavet mine felter med:
Ellipse2D.Double sanFrancisco = new Ellipse2D.Double(175, 220, fieldDiam, fieldDiam);
                g2d.setColor(Color.blue);
                g2d.fill(sanFrancisco);

Så hvis de rent faktisk kan ændres til Buttons, hvorpå jeg kan lave en mouselistener så er det helt perfekt.
Avatar billede arne_v Ekspert
20. maj 2022 - 02:59 #14
Du tegner på den måde.

Men da det er en low level måde at gøre det på så sætter du ikke bare en listener på det tegnede.

Du sætter en listener på hele panel og tester på koordinater der er clicket og om det ligger indenfor et bestemt område.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester