3

だからここに取り引きがあります:

その中に JPanel と JTextArea があります。JPanel の背景色のアルファ値は 200 です。JPanelを介して背景画像を部分的に見ることができます。半透明って言うじゃないですか。とにかく、JTextArea を非不透明に設定したので、それを完全に見ることができます。

JPanel p = new JPanel();
p.setBackground(new Color(237, 234, 215, 200);
JTextArea jta = new JTextArea("Blahblahblahblah");
jta.setOpaque(false);
p.add(jta);

ボタンを押すと、テキストは次のように変更されます。

jta.setText("new BlahBlah...");

最初のテキストは、新しい部分的に透明なフィルムでそこに残ります。私が追加したテキストはもちろん一番上に表示されますが、すぐ後ろに前のテキストが表示されます。テキストを数回変更すると、ゴーストが消えます。

リンクとしてのスクリーンショット。

翻訳 (スクリーンショットには連続して 3 つのショットがあります):
左の 1 つ: "8 つのうち 1 番目の質問: (政治的な質問)? (私のコメント: OK)"
中央: "8 つのうち 2 番目の質問: (別の質問、気にしないでください)? (私のコメント: 幽霊はそこにいます! [そしてそれを指し示す矢印])"
右側: "質問 # 8 のうち 8: (別の質問)? (私のコメント: OK)"

たとえば、このプログラムが交換する質問の数を 8 から 3 に減らすと、最後の質問は通常は良さそうに見え、ゴーストはなくなります。でも、何をしても固まってしまうこともあります。メモリ不足と何か関係があるのでしょうか (しかし、私はそれをほとんど飲み込みません)。

だから、私を助けてください、男たち!締め切りは48時間です。

PS。ご参考までに、その言語はフィンランド語です。私は学校のプロジェクトに取り組んでいます: これはさまざまなアプリケーションを持つことができる比較マシンになるでしょう.どんな問題についても候補者の意見を入力し、有権者も意見を入力することができ、マシンはどの候補者が有権者の考えに最も一致するかを計算します。私のホームページを見てください。興味がある場合は、プロジェクト ブログ (フィンランド語) でその他のスクリーンショットをご覧ください。

an55i

4

2 に答える 2

2
p.setBackground(new Color(237, 234, 215, 200);

Swing は透明な背景をサポートしていません。

Swing は、コンポーネントが次のいずれかであることを想定しています。

  1. opaque - カスタム ペイントを実行する前に、まずコンポーネントが背景全体を不透明な色で再描画することを意味します。
  2. 完全に透明 - この場合、Swing はカスタム ペイントを行う前に、最初の不透明な親コンポーネントの背景を最初にペイントします。

このsetOpaque(...)メソッドは、コンポーネントの不透明なプロパティを制御するために使用されます。

どちらの場合でも、これにより、ペイント アーティファクトが削除され、カスタム ペイントを適切に実行できるようになります。

透過性を使用する場合は、自分でカスタム ペイントを行って、背景がクリアされていることを確認する必要があります。

パネルのカスタム ペインティングは次のようになります。

JPanel panel = new JPanel()
{
    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
};
panel.setOpaque(false); // background of parent will be painted first

透過性を使用するすべてのコンポーネントで、同様のコードが必要になります。

または、上記の作業を行う任意のコンポーネントで使用できるカスタム クラスのBackground With Transparencyを確認できます。

于 2011-01-14T17:37:20.443 に答える
0

やっとちゃんと表示されるようになりました!それだけです:

  1. 内部のコンテナー (この場合は p) とコンポーネント (jta) の両方が setOpaque(false) である必要があります。
  2. コンテナーは、内部コンポーネントの背景色を取得することによって、常にそれ自体をクリアする必要があります。これは、実際には、内部コンポーネントがその先祖から取得した色です。コンテナ自体。

私はどういうわけか正しいではないですか?まあ、少なくともコードはうまくいきます。

クラス フィールド:

private JTextArea jta;
private JPanel p;

後で:

jta = new JTextArea("BlahBlahBLAH");
jta.setBackground(new Color(237, 234, 215, 200));
p = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        if(getContentPane().isAncestorOf(jta)) {
            g.setColor(jta.getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }
};

p.setOpaque(false);
jta.setOpaque(false);
p.add(ta);

以上です。「p」に「jta」を追加する前に、いくつかの境界線などを追加しました。そして最もクールなことは、私は実際にこれについて何かを学びました. ご支援ありがとうございます!

于 2011-01-14T22:27:17.243 に答える