Avatar billede simeone Nybegynder
12. oktober 2003 - 13:17 Der er 18 kommentarer og
1 løsning

Løsningsforslag til program?

Er der nogen, der kan komme med et kvalificeret bud på følgende:

Der skal laves et program, som vha. borderlayout tegner tre labels - north, center og south - med tekst i center og to farvede firkanter i både north og south.

På forhånd tak!
Avatar billede magoo20000 Nybegynder
12. oktober 2003 - 13:27 #1
Avatar billede magoo20000 Nybegynder
12. oktober 2003 - 13:30 #2
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BorderWindow extends JFrame {
    boolean inAnApplet = true;
   
    public BorderWindow() {
        Container contentPane = getContentPane();
        //Use the content pane's default BorderLayout.
        //contentPane.setLayout(new BorderLayout()); //unnecessary
 
        contentPane.add(new JLabel(""),
                        BorderLayout.NORTH);
        contentPane.add(new JLabel("CENTER"),
                        BorderLayout.CENTER);
        contentPane.add(new JLabel(""),
                        BorderLayout.SOUTH);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                if (inAnApplet) {
                    dispose();
                } else {
                    System.exit(0);
                }
            }
        });
    }

    public static void main(String args[]) {
        BorderWindow window = new BorderWindow();
        window.inAnApplet = false;

        window.setTitle("BorderLayout");
        window.pack();
        window.setVisible(true);
    }
}

Så mangler vi bare farverne i north og south.
Avatar billede arne_v Ekspert
12. oktober 2003 - 13:31 #3
Her et et stykke kode:

package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Simple extends JFrame {
    public Simple() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        JTextArea ta1 = new JTextArea("    ");
        ta1.setBackground(Color.RED);
        getContentPane().add(ta1, BorderLayout.NORTH);
        JLabel lbl2 = new JLabel("tekst");
        getContentPane().add(lbl2, BorderLayout.CENTER);
        JTextArea ta3 = new JTextArea("    ");
        ta3.setBackground(Color.BLUE);
        getContentPane().add(ta3, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        Simple f = new Simple();
        f.show();
    }
}
Avatar billede arne_v Ekspert
12. oktober 2003 - 13:32 #4
JLabel er ikke gode til farvede bokse, så jeg valgte JTextArea for
at illustrere.

Sandsyneligvis skal du bruge noget helt andet.
Avatar billede magoo20000 Nybegynder
12. oktober 2003 - 13:46 #5
Ja, og farven kan gøres vha. setBackground, som arne viser. Der er også et eksempel her: http://cg.cs.tu-berlin.de/java/javadeutsch/intro/3/9.html
Avatar billede arne_v Ekspert
12. oktober 2003 - 13:53 #6
Jeg kan bare ikke få JLabel og setBackground til at virke.

JPanel kan måske bruges:

import java.awt.*;
import javax.swing.*;

public class Simple extends JFrame {
    public Simple() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        JPanel p1 = new JPanel();
        p1.setBackground(Color.red);
        getContentPane().add(p1, BorderLayout.NORTH);
        JLabel lbl2 = new JLabel("tekst");
        getContentPane().add(lbl2, BorderLayout.CENTER);
        JPanel p3 = new JPanel();
        p3.setBackground(Color.blue);
        getContentPane().add(p3, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        Simple f = new Simple();
        f.show();
    }
}
Avatar billede simeone Nybegynder
12. oktober 2003 - 13:59 #7
Ah, jeg glemte nok at definere, at der skal tegnes to eksplicitte firkanter i  hvert af de to labels north og south, og at firkanterne skal være forskellig farve... det er ikke bare labels, der skal "udfyldes".
Avatar billede arne_v Ekspert
12. oktober 2003 - 14:21 #8
Vil du tegne dem med x,y,højde,længde ?
Avatar billede simeone Nybegynder
12. oktober 2003 - 14:38 #9
ja, præcis...
Avatar billede arne_v Ekspert
12. oktober 2003 - 15:02 #10
Så skal du over i noget a la:

import java.awt.*;
import javax.swing.*;

public class Simple extends JFrame {
    public Simple() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        JPanel p1 = new MyBox(0,0,50,50);
        p1.setForeground(Color.red);
        getContentPane().add(p1, BorderLayout.NORTH);
        JLabel lbl2 = new JLabel("tekst");
        getContentPane().add(lbl2, BorderLayout.CENTER);
        JPanel p3 = new MyBox(0,0,50,50);
        p3.setForeground(Color.blue);
        getContentPane().add(p3, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        Simple f = new Simple();
        f.show();
    }
}

class MyBox extends JPanel {
    private int x,y,w,h;
    public MyBox(int x, int y, int w, int h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
    public void paintComponent(Graphics g) {
        g.fillRect(x,y,w,h);
    }
}
Avatar billede _carsten Nybegynder
12. oktober 2003 - 19:07 #11
Jeg ville nok gøre det på en anden måde, lave en klasse som extender
JLabel og bruge den i min JFrame, se eksempel.


import javax.swing.*;
import java.awt.*;

public class Frame extends JFrame {
    private MyLabel label1, label2, label3;
   
    public Frame() {
        initComponents();
        setSize(150,150);
    }

    private void initComponents() {
        label1 = new MyLabel(Color.green, Color.yellow, "NORTH");
        label2 = new MyLabel(Color.lightGray, Color.lightGray, "CENTER");
        label3 = new MyLabel(Color.red, Color.blue, "SOUTH");
       
        getContentPane().add(label1, BorderLayout.NORTH);
        getContentPane().add(label2, BorderLayout.CENTER);
        getContentPane().add(label3, BorderLayout.SOUTH);
       
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new Frame().show();
    }   
}


class MyLabel extends JLabel{
    private Color squareLeft, squareRight;
   
    public MyLabel(Color squareLeft, Color squareRight, String text){
        super(text);
        this.squareLeft = squareLeft;
        this.squareRight = squareRight;
        setHorizontalAlignment(JLabel.CENTER);
    }
   
    public void paint(Graphics g){
        g.setColor(squareLeft);
        g.fillRect(0,0, getWidth()/2, getHeight());
       
        g.setColor(squareRight);
        g.fillRect(getWidth()/2, 0, getWidth()/2, getHeight());
       
        g.setColor(Color.black);
        paintComponent(g);
    }
}
Avatar billede simeone Nybegynder
12. oktober 2003 - 21:10 #12
Hmm, der er vist et par ting, jeg ikke har helt styr på... Hvad er fx JFrame? Hvis nu jeg istedet ville lave tre cirkler i forskellige farver i hhv. west og east, men stadig med tekst i center, hvordan ville det se ud? Jeg har en ide om det, men jeg kan ikke rigtig få konstrueret det. Mit umiddelbare bud ville være med en hovedklasse, som styrer layout og komponenter, og så en subklasse, der tegner de tre cirkler, men hvordan præcist er jeg ikke sikker på...
Tak igen igen
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:15 #13
JFrame er basis komponenten i Swing applikationer.
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:16 #14
Graphivs har også metoder til at tegne cirkeler: drawOval og fillOval.
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:21 #15
Graphics
Avatar billede _carsten Nybegynder
12. oktober 2003 - 22:12 #16
Arne har egentlig sagt det - godt nok er historien væsentlig længere,
hvilket indbærer at du nok skal have gang i nogle tutorials vedrørende
Swing, men for at give et indtryk af hvordan det kunne laves, for du
her nogle ændringer/tilføjelser til mit tidligere eksempel.



Erstat nedenstående metode i Frame klassen

private void initComponents(){
        label1 = new MyLabel(Color.green, Color.yellow, "NORTH");
        label2 = new MyLabel(Color.lightGray, Color.lightGray, "CENTER");
        label3 = new MyCircleLabel(Color.red, Color.blue, "SOUTH");
       
        getContentPane().add(label1, BorderLayout.NORTH);
        getContentPane().add(label2, BorderLayout.CENTER);
        getContentPane().add(label3, BorderLayout.SOUTH);
       
        pack();
    }


// Tilføj nedenstående klasse

class MyCircleLabel extends JLabel{
    private Color circleLeft, circleRight;
   
    public MyCircleLabel(Color circleLeft, Color circleRight, String text){
        super(text);
        this.circleLeft = circleLeft;
        this.circleRight = circleRight;
        setHorizontalAlignment(JLabel.CENTER);
    }
   
    public void paint(Graphics g){
        int felt = getWidth()/6;
        int height = getHeight();
       
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
       
        g.setColor(circleLeft);
        g.fillOval( (felt - getHeight())/2, 0, getHeight(), getHeight());
        g.fillOval( felt + (felt - getHeight())/2,0, getHeight(), getHeight());
        g.fillOval( felt * 2 + (felt - getHeight())/2,0, getHeight(), getHeight());
       
        g.setColor(circleRight);
        g.fillOval( felt * 3 + (felt - getHeight())/2,0, getHeight(), getHeight());
        g.fillOval( felt * 4 + (felt - getHeight())/2,0, getHeight(), getHeight());
        g.fillOval( felt * 5 + (felt - getHeight())/2,0, getHeight(), getHeight());
       
        g.setColor(Color.black);
        paintComponent(g);
    }
}
Avatar billede _carsten Nybegynder
12. oktober 2003 - 22:32 #17
Jeg ved ikke lige hvor du skal begynde at læse, enten her

http://java.sun.com/docs/books/tutorial/uiswing/mini/index.html

Eller måske kan du springe frem til denne
http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html

Under alle omstændigheder tror jeg du er sprunget for langt frem,
så første link er nok stedet (da du ikke kender JFrame).

Er det derimod en øvelse fra en lærebog, så burde du egentlig kende
JFrame, paint og lidt Graphics - jeg ved det ikke !
Avatar billede simeone Nybegynder
12. oktober 2003 - 22:38 #18
Hæ, siden mit sidste indlæg har jeg faktisk fået nogenlunde styr på det... Jeg fandt selv frem til ovenstående sider... Og ja, jeg var sprunget for langt frem, og det skyldtes sådan set både egne ambitioner, og så at jeg mere eller mindre "fór vild" på suns website... Det er ikke den mest overskuelige side de har lavet. Lidt synd egentlig, for deres tutorial er uden tvivl rigtig god...

Men tak for hjælpen
Avatar billede _carsten Nybegynder
12. oktober 2003 - 23:09 #19
Ha-ha

Det er i java på samme måde som med banklån og forsikringer etc.

LÆS OGSÅ DET DER STÅR MED SMÅT !
:-) :-)
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
Kategori
Kurser inden for grundlæggende programmering

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