Java Swing - Translucent Components causing Artifacts

前端 未结 3 1449
闹比i
闹比i 2021-01-21 02:18

I\'m currently working on a group project for a college course, and I\'ve hit a bit of a stumbling block. The program we have decided to implement is a Peer-to-Peer chat client

相关标签:
3条回答
  • 2021-01-21 02:53

    You need to tell Swing that the components are translucent, so it does also paint the background when repainting the changed components. For this, your components have to return false from the isOpaque() method (this can be achieved by setOpaque(false) when no subclass overwrites isOpaque to do something else).

    With this, it should work without any manual repainting of everything, as the other answers proposed. (I already did this once.)

    Edit: The reason for this is that Swing uses an optimized repainting-algorithm, repainting only these components which really need repainting (for example, a JTextField after some input) or components in front of such ones, as long as they are opaque. When a component needing repainting is not opaque (= filling its whole space with non-translucent color), also repainting of the components behind them is necessary.

    0 讨论(0)
  • 2021-01-21 03:01

    myComponent.revalidate();
    myComponent.repaint();
    Not sure if it "force" the redraw, but it ask it to do it when possible.

    0 讨论(0)
  • 2021-01-21 03:15

    Try JFrame.repaint(). That should work. If you want custom designing of your JFrame then you will have to override paint() method of JFrame. Additionally, if you want each component to be custom designed you will have to override the paint() method of each of your GUI component. Couple of things to note:

    1. You do not have to call paint() for any GUI component. You only need to call repaint().
    2. In case you do the overriding of the other GUI components [JButton, JTextField...], you do not have to call their repaint() method. The parent Container's [JFrame, JPanel...] repaint() will do the job.
    0 讨论(0)
提交回复
热议问题