似乎不可能修复Graphics2D缺少的代码,我必须设置动画的修复大小,否则一些开始外面的矩形490 x 490冻结或在屏幕上摇晃
我的SSCCE
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;
import java.util.Vector;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.table.*;
public class OneTwoThree implements Runnable {
private String testS;
private JFrame frame = new JFrame("frameTitle");
private JScrollPane tblS = new JScrollPane();
private JTable tbl;
private Vector<String> rOrH;
private long t1 = 0L;
private long t2 = 0L;
private AlphaChars aChars = new AlphaChars();
private GradientViewPortOriginal tableViewPort;
private JViewport viewport = new JViewport();
private Random random …
Run Code Online (Sandbox Code Playgroud) 我需要在JScrollPane中创建一个带有可调整大小的列的JTable(当用户增加列宽时 - 出现水平滚动条).为此,我有用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
.此外,当视口宽度足以包含整个表格时 - 列应该拉伸以填充视口宽度.为了实现这一点,我有getScrollableTracksViewportWidth()
JTable类的覆盖方法如下:
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
Run Code Online (Sandbox Code Playgroud)
这种方法很有效,除了一件事:当我第一次尝试调整列的大小时,它返回自己的宽度以开始位置.如果我快速调整列大小并释放鼠标表继续工作正常.那么,这种行为的原因是什么?为什么表尝试调整大小,即使getScrollableTracksViewportWidth()
返回false?或者,也许,你可以提出更好的解决方案来实现这样的调整大小模式?
贝娄是上述问题的简单工作示例:
import javax.swing.*;
public class TestTable {
private static Object[][] data = new Object[][] {
{ "a", "b", "c" },
{ "d", "e", "f" }
};
private static Object[] colNames = new Object[] { "1", "2", "3" };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTable table = new JTable(data, colNames) …
Run Code Online (Sandbox Code Playgroud) 我用a JScrollPane
来包装一个JTable
.根据配置,有一些空间未被表占用.它被绘制为灰色(看起来它是透明的,你可以看到后面的组件).如何将此区域设置为某种颜色?
这是一个SSCCE来说明.
import java.awt.Color;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class DialogDemo extends JDialog {
public static void main(final String[] args) {
final DialogDemo diag = new DialogDemo();
diag.setVisible(true);
}
public DialogDemo() {
super();
setTitle("SSCCE");
final Vector<Vector<String>> rowData = new Vector<Vector<String>>();
final Vector<String> columnNames = new VectorBuilder<String>().addCont("Property").addCont("Value");
rowData.addElement(new VectorBuilder<String>().addCont("lorem").addCont("ipsum"));
rowData.addElement(new VectorBuilder<String>().addCont("dolor").addCont("sit amet"));
rowData.addElement(new VectorBuilder<String>().addCont("consectetur").addCont("adipiscing elit."));
rowData.addElement(new VectorBuilder<String>().addCont("Praesent").addCont("posuere..."));
final JTable table = new JTable(rowData, columnNames);
JScrollPane pane = new JScrollPane(table);
// ************* make …
Run Code Online (Sandbox Code Playgroud) 我从MeBigFatGuy
有趣的问题中获得灵感,在这个连接中,我有一个非常具体的问题Graphisc2D
,如何改变BackGround Color
取决于是否JTables Row
可见JViewPort
,
1)如果1st. & last JTables Row
在中可见JViewPort
,则BackGround将被着色为Color.red
2)如果1st. & last JTables Row
在中不可见JViewPort
,那么BackGround
就会被着色了Color.whatever
来自SSCCE
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.RepaintManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableModel;
/*
https://stackoverflow.com/questions/1249278/
how-to-disable-the-default-painting-behaviour-of-wheel-scroll-event-on-jscrollpan
*
and
*
https://stackoverflow.com/questions/8195959/
swing-jtable-event-when-row-is-visible-or-when-scrolled-to-the-bottom
*/
public class ViewPortFlickering {
private JFrame frame = new JFrame("Table");
private JViewport viewport = new JViewport(); …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个Java应用程序,允许用户使用鼠标查看图像和平移图像.为了实现图像的平移,我使用JViewports 的组合mouseClicked
和mouseDragged
事件.大部分代码都在mouseDragged方法中
public void mouseDragged(MouseEvent e, WindowWrapper w) {
final JViewport vp = someFieldViewPort;
//Getting the point that the mouse is dragged to to
Point cp = e.getPoint();
final Point vPoint = vp.getViewPosition();
//I found the image went off the content to show the white border so I included this
// Here pp is a field that I sent when the mouse is clicked in a separate method
if(vPoint.getX()+pp.x-cp.x>=0 & vPoint.getY()+pp.y-cp.y>=0)
vPoint.translate(pp.x-cp.x, pp.y-cp.y);
else if(vPoint.getX()+pp.x-cp.x>=0 & …
Run Code Online (Sandbox Code Playgroud) 实现Scrollable接口需要实现getPreferredScrollableViewportSize()方法.这通常只需将调用转发到getPreferredSize()来完成 - 除非Scrollable的其他参数可能影响首选的JViewport大小,例如JTree中的setVisibleRowCount()方法.
我有一种情况,我认为这种方法可以帮助我实现我的目标,但在我的getPreferredScrollableViewportSize()实现中的一个简单的print语句确认它永远不会被调用.搜索JScrollPane,ScrollPaneLayout和JViewport确认没有(直接)调用该方法.然而,JScrollPane中的注释明确指出ScrollPaneLayout使用它,我可以确认它是在JTree中按预期实现的.
什么时候调用,什么类(大概是LayoutManager)和什么时候?我正在使用JDK 1.7_07
我在 JScrollpane 中有一个 JPanel。我在 BufferedImage 上绘制,并将其显示在 JPanel 上。在 JScrollpane 的左上角,我想要一张图片,当我向下滚动查看 JPanel 的其余部分时,该图片始终保留在该角落。这里是Jpanel的paintComponent方法:
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if (bufferedImage != null){
g.drawImage(bufferedImage, 0, 0, this);
Point p = parent.getViewPosition();
System.out.println("paintComponent(): "+ p.x + "," + p.y);
g.setColor(Color.RED);
g.fillRect(p.x + 20, p.y + 20, 200, 200);
}
}
Run Code Online (Sandbox Code Playgroud)
其中parent.getViewPosition()给我scrollPane.getViewport().getViewPosition()。当我启动时,我可以看到左上角有红色矩形的缓冲图像。当我向下滚动时,我可以看到缓冲图像的其余部分,但红色矩形向上移动,然后消失,并且当我向上滚动时不再出现。在控制台中,我可以看到滚动时点 p 发生变化:
paintComponent(): 0,0
paintComponent(): 0,10
paintComponent(): 0,20
paintComponent(): 0,30
paintComponent(): 0,40
paintComponent(): 0,50
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题吗?
我有一个JScrollPanel
包括一个大面板,它自己包括3个内板.我想把一个面板(例如)放在一个特殊的地方,以便始终可以看到,我的意思是用户可以滚动到任何想要的地方,但该面板始终位于其他组件的顶部,并且不会移动.我尝试过这样做,JLayeredPane
但我做不到.我该怎么办?
我有一个JScrollPane,我在JScrollPane中放了一个JPanel.JPanel拥有可变数量的JLabel.
这是我如何"新"它:
JPanel dataPanel = new JPanel();
//then do a for loop to put a few JLabels in dataPanel
JScrollPane scrollPane = new JScrollPane(dataPanel);
Run Code Online (Sandbox Code Playgroud)
我想知道如何在另一堂课中获得这些JLabel?我尝试了以下代码,但无法使用ClassCastException.在那个类中,我成功获得了JScrollPane,我将使用scrollPane来表示它.
//I only put a panel in the JScrollPane, so I used 0 in the getComponent() method
JPanel panel = scrollPane.getComponent(0);
for(int i = 0; i < panel.getComponentCount(); i++){
JLabel label = (JLabel)panel.getComponent(i);
}
Run Code Online (Sandbox Code Playgroud)
事实上,在声明中:
JPanel panel = scrollPane.getComponent(0);
Run Code Online (Sandbox Code Playgroud)
抛出ClassCastException.
java.lang.ClassCastException: javax.swing.JViewport cannot be cast to javax.swing.JPanel
Run Code Online (Sandbox Code Playgroud)
赞赏求助:)
JScrollPane
当用户滚动它时,我需要处理事件。在这里建议使用addAdjustmentListener
toJViewport
或 Vertical/HorizontalScrollBar。
有什么区别,我应该选择哪种方法?
我也想用scrollRectToVisible
同样的方法JScrollPane
,我应该期待AdjustmentListener
使用这种方法吗?
另外我想知道是否scrollRectToVisible
尝试进行最小滚动以使所需的矩形可见,还是尝试使其在JViewport
?
UPD:要求:
1) 有一个 JScrollPane,其中一个 JPanel 有许多 JLabel(ImageIcon),因此其中一些不可见。
2)当网络事件发生时,我需要向用户显示 JLabel 之一(使其可见)。如果 I 最初不可见,则 JScrollPane 应自动滚动。这就是为什么我提到scrollRectToVisible
.
3) 在里面有 ImageIcon 的 JLabel 上方,我需要显示一条消息来解释这个元素发生了什么。由于 JLayeredPane 层次结构更高,该消息当前被实现为另一个带有浮点数的 JLabel。现在的问题是,如果用户滚动 JScrollPane,浮动 JLabel 应该相应地移动到相应 JLabel(ImageIcon) 的顶部。
UDP2:SSCCE
我还没有实现浮动 JLabel,但我已经不喜欢索引为 11 的标签的反应,scrollRectToVisible
因为它被裁剪了一半。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList; …
Run Code Online (Sandbox Code Playgroud) 我有一个Swing JTable.它很大,用户可以向上和向下滚动以查看他们想要处理的数据行.当用户停止滚动时,我想知道JTable的行号,它是用户可以看到的第一个可见行.在用户进行其他操作之后,我想用它来回滚到表中的这个位置(我知道如何做滚动的部分 - 它得到了第一个让我难过的可见行).
java ×11
jviewport ×11
swing ×11
jscrollpane ×6
jtable ×4
background ×1
gradient ×1
graphics2d ×1
image ×1
imageicon ×1
jlayeredpane ×1
jpanel ×1
jscrollbar ×1
point ×1
scrollable ×1