Avatar billede longshanks Nybegynder
27. februar 2003 - 17:17 Der er 6 kommentarer og
1 løsning

JInternal Frame og JColorChooser

Jeg har en JInternalFrame, med en JTextPane indeni, jeg kan vælge baggrundsfarven på, via en JColorChooser....Jeg kan godt ændre baggrundsfarven uden problemer, men der hvor JColorchooseren har været er der et stort desktop farvet område der ikke forsvinder før jeg har lavet et par mellemrum i JTextPane´n

Håber i forstår hvad jeg mener ellers spørg....

Jeg har prøvet med alle mulige former for updateUI() og repaint() på både JTextPane og JInternalFrame og JDesktopPane
Avatar billede viht Nybegynder
27. februar 2003 - 22:11 #1
Viser du chooseren ovenpå JTextPane't?
Avatar billede =maddog= Nybegynder
27. februar 2003 - 22:44 #2
når du viser JColorChooseren skal du angive hvilken komponent er der dets "anker". Dette komponent vil (så vidt jeg husker) få kaldt sin revalidate() metode så dirty regions bliver gentegnet.
Nu kan det jo faktisk godt være at de rigtige områder ikke bliver sat som dirty og derfor ikke gentegnet, men jeg tror du ikke har sat den rigtige modale komponent.
Swing gentegner ikke alting ligesom AWT. Det er forhodsvist "intelligent" og nøjes med at registrere hvilket områder der ændrer sig og gentegner derfor kun disse. Problemet er hvis de rigtige områder ikke bliver sat.
Hvis du kalder repaint bør du bruge metoden der tager et Rectangle objekt som argument, fremfor metoden uden argument. Med dette Rectangle objekt angiver du hvilke områder der er ærdret (dirty) og har brug for gentegning.
Avatar billede longshanks Nybegynder
28. februar 2003 - 08:04 #3
Viht: Ja jeg viser chooseren ovenpå JTextPane.....
=maddog=: Jeg kigger lige på det, med rectangle repaint, det lyder meget godt din kommentar..

Vender snart tilbage...
Avatar billede =maddog= Nybegynder
28. februar 2003 - 08:10 #4
du kan evt. bruge metoden getBounds til hurtigt at estimere hvilken region den pågældende komponent dækker.
Rectangle dirty = internFrame.getBounds();
myFrame.repaint(dirty);
Avatar billede viht Nybegynder
28. februar 2003 - 08:30 #5
Jeg har lavet et et eksempel, hvor jeg har prøvet at lade både den aktive JInternalFrame og ejer-JFrame være anker komponenter til JCholorChooseren. I begge tilfælde får hele JTextPane't farven der er valgt?!

//TestFrame.java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class TestFrame extends JFrame {
   
    private JDesktopPane desktop;
   
    public TestFrame() {
        super("Test");
        setSize(400,400);
       
        desktop = new JDesktopPane();
       
        JPanel buttonPanel = new JPanel();
        JButton addButton = new JButton("Add frame");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                addInternalFrame();
            }
        });
        JButton showColorChooserButton = new JButton("Shov colorchooser");
        showColorChooserButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                showColorChooser();
            }
        });
        buttonPanel.add(addButton);
        buttonPanel.add(showColorChooserButton);
        getContentPane().add(desktop, BorderLayout.CENTER);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
    }
   
    private void addInternalFrame() {
        int count = desktop.getAllFrames().length;
        TextPaneInternalFrame frame = new TextPaneInternalFrame("Internal Frame");
        frame.setSize(200,200);
        desktop.add(frame);
        frame.setLocation(count*10, count*10);
        frame.setVisible(true);
    }
    private void showColorChooser() {
        JInternalFrame[] frames = desktop.getAllFrames();
        for( int i = 0; i < frames.length; i++ ) {
            if( frames[i].isSelected() ) {
                JColorChooser chooser = new JColorChooser();
                Color color = chooser.showDialog(frames[i], "Pick a color", Color.red);
                ((TextPaneInternalFrame)frames[i]).getTextPane().setBackground(color);
            }
        }
    }
}

class TestIt {
    public static void main(String[] args) {
      new TestFrame().show();
  }
}
//TextPaneInternalFrame.java:
import javax.swing.*;

public class TextPaneInternalFrame extends JInternalFrame {
    private JTextPane pane;
   
    public TextPaneInternalFrame(String title) {
        super(title, true, true, true, true);
        pane = new JTextPane();
        setContentPane(pane);
    }
    public JTextPane getTextPane() {
        return pane;
    }
}
Avatar billede longshanks Nybegynder
28. februar 2003 - 11:54 #6
Tak for indlæggene viht´s løsning gjorde imidlertid forskellen......så han får point.....
Avatar billede =maddog= Nybegynder
28. februar 2003 - 12:36 #7
[citat/mig selv]
når du viser JColorChooseren skal du angive hvilken komponent er der dets "anker". Dette komponent vil (så vidt jeg husker) få kaldt sin revalidate() metode så dirty regions bliver gentegnet.
[citat/slut]
.. men viht skal naturligvis have hele potten. Det var ham der gad sætte sig ned og lave en model der dur.
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