每次我调用IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)并传递一个类CPE_PROJECT的IClasspathEntry时,它返回一个空列表.我暂停调试器并在Eclipse Display视图中运行以下行以查看发生了什么:
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
cpe.toString();
(java.lang.String) /Some Project[CPE_PROJECT][K_SOURCE][isExported:false][combine access rules:false]
// Show that the referenced project exists and has a root containing source
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
IProject someProject = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().toString());
IJavaProject someJavaProject = (IJavaProject) someProject.getNature(JavaCore.NATURE_ID);
IPackageFragmentRoot pfr = someJavaProject.getPackageFragmentRoots()[0];
new Boolean(pfr.getKind() == IPackageFragmentRoot.K_SOURCE).toString();
(java.lang.String) true
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
javaProject.findPackageFragmentRoots(cpe);
(org.eclipse.jdt.core.IPackageFragmentRoot[]) []
Run Code Online (Sandbox Code Playgroud)
类路径条目是Java项目的类路径的一部分,它的类型为CPE_PROJECT.此外,引用的Java项目(标题为"Some Project")至少有一个包含源的根.根据IJavaProject的javadoc,它似乎应该返回至少一个IPackageFragmentRoot,但它不会.
知道我在这里误会了什么吗?如何从CPE_PROJECT类型的IClasspathEntry获取IPackageFragmentRoots而不做一些hackish?(我的意思是,我可以从类路径条目中获取IJavaProject并遍历其原始类路径,忽略未导出的条目,以搜索IPackageFragmentRoots.)
根据我对A*启发式的理解以及Bresenham算法如何工作,这可能是不可能的,因为只有当前状态和目标状态被传递给启发式函数.但也许某人有一个聪明的解决方案来解决这个问题.
我正在使用A*来计划网格上的路径,并且我想要一种启发式方法,当当前状态和目标之间存在自由空间或绕过障碍物时,可以使最佳路径遵循Bresenham线.
这里有一些图像来说明问题.
曼哈顿距离:
如果世界上的运动像一个网格上的棋子一样,这将是完美的,但我最终会将A*路径转换为连续平面上的运动,所以这确实很有效.

欧几里德距离:
更好,但仍然不完美.注意最后的直线.对角线可以很容易地保持对角线,这就是我想要的.

我想要的是:
Bresenham线被吸引到下一个回合或目标.

我在这里找到了一个很好的资源,http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html触及了我正在寻找的东西,但似乎只能用于从开始到目标绘制Bresenham线.我想要的是Bresenham线也被绕到障碍物的下一个转弯.
有什么想法可以很好地解决这个问题吗?
我有这样的声明:
((lambda (a b c) (+ a b c)) 1 2 3) ; Gives 6
Run Code Online (Sandbox Code Playgroud)
我希望能够将列表传递给它:
((lambda (a b c) (+ a b c)) (list 1 2 3))
Run Code Online (Sandbox Code Playgroud)
...除了这不起作用,因为整个列表作为'a'传递.有没有办法将列表分解为参数?
我正在寻找的东西类似于Python中的*字符.对于那些不熟悉语法的人:
def sumthree(a, b, c):
print a + b + c
sumthree(1, 2, 3) # Prints 6
sumthree(*(1, 2, 3)) # Also prints 6
Run Code Online (Sandbox Code Playgroud) 我有一个JTextArea,我已将word-wrap和wrap-style-word设置为true.我希望将JTextArea"打包"到给定指定宽度的最小可能高度.
为此,我正在计划使用...计算字体的高度
Font font = jTextArea.getFont();
FontMetrics fontMetrics = jTextArea.getFontMetrics(font);
int lineHeight = fontMetrics.getAscent() + fontMetrics.getDescent();
Run Code Online (Sandbox Code Playgroud)
...然后将其乘以JTextArea中使用的行数.问题是JTextArea.getLineCount()计算忽略换行的换行数.
如何计算JTextArea中使用的行数,包括由自动换行引起的行数?
这里有一些演示代码可以更容易地解决这个问题.我有一个监听器,每次调整窗口大小时都打印出行数.目前,它总是打印1,但我想补偿自动换行并打印出实际使用的行数.
编辑:我在下面的代码中包含了问题的解决方案.静态countLines方法提供了解决方案.
package components;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.text.*;
import javax.swing.*;
public class JTextAreaLineCountDemo extends JPanel {
JTextArea textArea;
public JTextAreaLineCountDemo() {
super(new GridBagLayout());
String inputStr = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmo";
textArea = new JTextArea(inputStr);
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
// Add Components to this panel.
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER; …Run Code Online (Sandbox Code Playgroud) 我想一次只运行一个Java Swing应用程序实例.如果打开第二个实例,我希望它将其参数传递给已经运行的实例.我怎样才能使用漂亮,干净的Java API?(我不想自己使用套接字或文件系统锁来实现它).
我已经看到了许多用于在Java中实施单个实例的解决方案,但我所知道的唯一一个将参数传递给正在运行的实例的是使用JNLP的SingleInstanceService,而我不是在编写Java Web启动应用程序,所以我可以'使用这个(我尝试时得到了NullPointerException).
我有一个包含超链接的JTextPane.当它是可编辑的时,超链接是不可点击的,并且当鼠标悬停在它们上时光标不会改变状态(例如,到手).如果它不可编辑,则可以单击超链接,并且当鼠标悬停在超链接上时,光标会改变状态.完善.
这是问题,如果光标在其可编辑性更改时已经悬停在JTextPane上,则光标不会更新.光标更新的唯一方法(我知道)是移动它.
即使光标可能不会改变状态,当按下鼠标并且JTextPane不可编辑时,HyperlinkListener将看到ACTIVATED事件.有没有办法强制光标重新评估它应该处于什么状态并在我更改其下面的面板状态时自行更新?
基本上,我希望光标图标始终对应于按下鼠标时会发生的情况.是的,这是一个边界情况,但它仍然很烦人.
以下是一些示例代码.
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* Every five seconds the editability of the JTextPane is changed. If the
* editability changes to false when the mouse is hovering over the hyperlink,
* the cursor will not change to a hand until it is moved off and then back
* onto the hyperlink. If the editability changes to true when the mouse is
* …Run Code Online (Sandbox Code Playgroud) 我使用我之前声明的Comparator在ArrayList上调用Collections.sort().
ArrayList<Employee> list = new ArrayList<Employee>();
Comparator<Employee> comparator = new Comparator<Employee>() {
public int compare(Employee o1, Employee o2) {
return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
}
};
...
Collections.sort(list, comparator);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,sort尝试将我的ArrayList的元素转换为Comparables,即使我传递了Comparator.为什么会发生这种情况?
如果它有用,这是我的堆栈跟踪
Exception in thread "Thread-3" java.lang.ClassCastException: processing.app.EmployeeManager$PrettyOkayEmpolyee cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at foobar.Main.doSomeSorting(Main.java:140)
...
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud) 我试图在JScrollPane上绘制一个红色正方形.我下面的代码对此做了一个很好的工作,但有时当我滚动视口太快时,红色方块向上或向下跳跃.

这让我觉得奇怪,因为JScrollPane本身是静止的,所以我假设Swing不会试图移动其中绘制的组件.我猜测实际发生的是红色方块与视口相关联,视口显示移动的图形.
无论如何,如何阻止红色方块跳跃并在列表上成功绘制红色方块?也许我完全采取了错误的做法.
package components;
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
@SuppressWarnings("serial")
public class DialogWithScrollPane extends JFrame {
public DialogWithScrollPane() {
super();
setResizable(false);
Container pane = getContentPane();
Vector<Object> listOfStuff = new Vector<Object>();
for (int i = 0; i < 100; i++) {
listOfStuff.add(Integer.toString(i));
}
final JScrollPane scrollPane = new JScrollPane() {
public void paint(Graphics g) {
System.out.println("JScrollPane.paint() called.");
super.paint(g);
g.setColor(Color.red);
g.fillRect(20, 50, 100, 200);
}
};
JList list = new JList(listOfStuff) {
public void paint(Graphics g) {
System.out.println("JList.paint() …Run Code Online (Sandbox Code Playgroud) 我有以下课程
class Parent {
virtual void doStuff() = 0;
};
class Child : public Parent {
void doStuff() {
// Some computation here
}
};
Run Code Online (Sandbox Code Playgroud)
我有一个具有以下签名的功能.
void computeStuff(std::vector<boost::shared_ptr<Parent> >);
Run Code Online (Sandbox Code Playgroud)
如果我可以重构我的代码(包括函数签名),那么将函数传递computeStuff给Child对象列表的最佳方法是什么?
从本质上讲,我希望编译和运行以下代码片段
std::vector<boost::shared_ptr<Child> > listOfChilds = getList();
computeStuff(listOfChilds);
Run Code Online (Sandbox Code Playgroud) java ×6
list ×2
swing ×2
a-star ×1
algorithm ×1
awt ×1
bresenham ×1
c++ ×1
collections ×1
comparable ×1
comparator ×1
cursor ×1
eclipse ×1
eclipse-jdt ×1
grid ×1
hyperlink ×1
inheritance ×1
jscrollpane ×1
jtextarea ×1
line ×1
mouse ×1
parameters ×1
racket ×1
scheme ×1
shared-ptr ×1
textarea ×1
vector ×1